MATLAB 编写简易电子琴

2023-11-01 07:00
文章标签 matlab 编写 简易 电子琴

本文主要是介绍MATLAB 编写简易电子琴,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 声音模型
  • 音色
  • 简易电子琴

用MATLAB遍了一个小程序,可以弹奏一些简单的曲子。演示视频:
Bilbili视频:MATLAB 编写简易电子琴
一个电子琴基本的要求应当是能按键盘命令发出特定音高和音色的声音。键盘命令我用的是input 函数,缺点是每按一个键要回车使得弹奏很难连续,但目前没想到合适的替代方法;而声音的音高和音色则分别基频和泛频决定

声音模型

声音本质是机械振动产生的波通过介质传播至人耳,这一振动可由函数 x ( t ) x(t) x(t)表示,离散化后即为向量 x n x_n xn以及采样率 f s f_s fs,且满足 x n = x ( t n ) , t n = n / f s x_n=x(t_n), t_n=n/f_s xn=x(tn),tn=n/fs.
而MATLAB 中可用sound(x,fs)函数发出一段声音,如下面的代码运行后将发出一段白噪声:

 x=normrnd(0,1,1,10000);fs=5000;sound(x,fs)

琴弦则近似以如下方式振动(数学物理方法等教材有介绍):
x ( t ) = ∑ n = 1 N A n s i n ( 2 π f n t + ϕ n ) x(t)=\sum_{n=1}^{N}A_nsin(2\pi f_nt+\phi_n) x(t)=n=1NAnsin(2πfnt+ϕn)
其中基频 f 1 f_1 f1 决定声音的音高, f n , n > 1 f_n, n>1 fn,n>1决定音色。基频与音阶的部分对应表如下(没有加升降音):
E4 329.63
F4 349.23
G4 392
A4 440
B4 493.88
C5 523.25
D5 587.33
E5 659.25
F5 698.46
G5 783.99
A5 880
B5 987.77
C6 1046.5
D6 1174.66
E6 1318.51
F6 1396.91
G6 1567.98
A6 1760
B6 1975.53

于是,在MATLAB中发出A4音的代码如下:

fs=5000;
t=0:1/fs:1;
f=440;
x=sin(2*pi*f*t);
sound(x,fs)

音色

除基频 f 1 f_1 f1外,还有由高阶模式振动产生的倍频,各本征频频的振幅 A n A_n An以及相位 ϕ n \phi_n ϕn确定了声音的音色,简单起见,假定 ϕ 0 = 0 \phi_0=0 ϕ0=0。并加入一个衰减:
x ( t ) = e − t 2 / 2 t 0 2 ∑ n = 1 N A n s i n ( 2 π f n t ) x(t)=e^{-t^2/2t_0^2}\sum_{n=1}^{N}A_nsin(2\pi f_nt) x(t)=et2/2t02n=1NAnsin(2πfnt)
从网上找到一段任意音高的钢琴音,傅里叶变换后频谱如下:
记录下前八个本征频率对应的振幅 A n A_n An如下:
645.4
183.7
30
20
20
20
20
56

简易电子琴

编写函数piano(f,amp),其中f 为基频,amp为最低的数个本征频率对应的振幅,其中f通过查找键盘输入的音阶对应的频率得到。再循环运行此函数即可
代码如下:

Amp=xlsread('Amp.xlsx');
Amp=1/max(Amp)*Amp;
n=length(Amp);f=xlsread('frequency.xlsx','B:B');
%To input "exit" to exit
IN=0;
or=1;
while 1IN=input('','s');switch INcase 's'or=1;case 'a'or=0;case 'd'or=2;case '1'piano(f(or*7+1),Amp);case '2'piano(f(or*7+2),Amp);case '3'piano(f(or*7+3),Amp);case '4'piano(f(or*7+4),Amp);case '5'piano(f(or*7+5),Amp);case '6'piano(f(or*7+6),Amp);case '7'piano(f(or*7+7),Amp); case 'exit'breakotherwisedisp('Again');end
endfunction p=piano(f,amp)
fs=32000;
t=0:1/fs:1;
x=0*t;
n=length(amp);
for i=1:nx=x+amp(i)*sin(2*pi*f*i*t); 
end
x=x.*exp(-1/(2*0.3^2)*t.^2);
sound(x,fs)
p=1;
end

这一电子琴小程序是写着玩的,非常简陋,一个较大的问题就是弹奏很难连续。如果有改进建议欢迎留言

这篇关于MATLAB 编写简易电子琴的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/321297

相关文章

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization