Matlab 制作《最炫民族风》弱爆了,附代码

Matlab 制作《最炫民族风》弱爆了,附代码

分类: matlab   1212人阅读  评论(0)  收藏  举报
matlab reference
[plain]  view plain copy
  1.    
[plain]  view plain copy
  1. 大家可以在Matlab下实验下。。。。。。  
[plain]  view plain copy
  1. % Most shining national wind//最炫民族风 on Matlab  
  2. % The Modification is from "canon", not by me  
  3.   
  4. fs = 44100; % sample rate  
  5. dt = 1/fs;  
  6.   
  7. T16 = 0.125;  
  8.   
  9. t16 = [0:dt:T16];  
  10. [temp k] = size(t16);  
  11.   
  12. t4 = linspace(0,4*T16,4*k);  
  13. t8 = linspace(0,2*T16,2*k);  
  14.   
  15. [temp i] = size(t4);  
  16. [temp j] = size(t8);  
  17.   
  18. % Modification functions  
  19. mod4=(t4.^4).*exp(-30*(t4.^0.5));  
  20. mod4=mod4*(1/max(mod4));  
  21. mod8=(t8.^4).*exp(-50*(t8.^0.5));  
  22. mod8=mod8*(1/max(mod8));  
  23. mod16=(t16.^4).*exp(-90*(t16.^0.5));  
  24. mod16=mod16*(1/max(mod16));  
  25.   
  26. f0 = 2*146.8; % reference frequency  
  27.   
  28. ScaleTable = [2/3 3/4 5/6 15/16 ...  
  29. 1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...  
  30. 2 9/4 5/2 8/3 3 10/3 15/4 4 ...  
  31. 1/2 9/16 5/8];  
  32.   
  33. % 1/4 notes  
  34. do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);  
  35. re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);  
  36. mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);  
  37.   
  38. fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);  
  39. so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);  
  40. la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);  
  41. ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);  
  42. do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);  
  43. re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);  
  44. mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);  
  45. fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);  
  46. so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);  
  47. la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);  
  48. tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);  
  49. ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);  
  50. do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4);  
  51. re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4);  
  52. mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4);  
  53. fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4);  
  54. so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);  
  55. la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);  
  56. ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);  
  57. do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);  
  58. blkf = zeros(1,i);  
  59.   
  60. % 1/8 notes  
  61. do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);  
  62. re0e = mod8.*cos(2*pi*ScaleTable(22)*f0*t8);  
  63. mi0e = mod8.*cos(2*pi*ScaleTable(23)*f0*t8);  
  64.   
  65. fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);  
  66. so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);  
  67. la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);  
  68. ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);  
  69. do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);  
  70. re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);  
  71. mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);  
  72. fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);  
  73. so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);  
  74. la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);  
  75. tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);  
  76. ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);  
  77. do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);  
  78. re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);  
  79. mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);  
  80. fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);  
  81. so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);  
  82. la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);  
  83. ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);  
  84. do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);  
  85. blke = zeros(1,j);  
  86.   
  87. % 1/16 notes  
  88. do0s = mod16.*cos(2*pi*ScaleTable(21)*f0*t16);  
  89. re0s = mod16.*cos(2*pi*ScaleTable(22)*f0*t16);  
  90. mi0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16);  
  91.   
  92. fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16);  
  93. so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);  
  94. la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);  
  95. ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16);  
  96. do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16);  
  97. re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);  
  98. mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16);  
  99. fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);  
  100. so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);  
  101. la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);  
  102. tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);  
  103. ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);  
  104. do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);  
  105. re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);  
  106. mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);  
  107. fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);  
  108. so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);  
  109. la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);  
  110. ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);  
  111. do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16);  
  112. blks = zeros(1,k);  
  113.   
  114.   
  115. % Melody by Schau_mal   
  116. part0 = [mi1f la0e la0e do1f mi1f ...  
  117. re1e re1s mi1s re1e do1e re1e do1e la0f ...  
  118. mi1f la0e la0e do1f mi1f ...  
  119. so1e re1s mi1s re1e do1e re1e do1e ti0e so0e ...  
  120. mi1f la0e la0e do1f mi1f ...  
  121. re1e re1s mi1s re1e do1e re1e do1e la0e so0e ...  
  122. mi1f la0e la0e do1f mi1f ...  
  123. so1e mi1e blkf blkf blkf ...  
  124. ];  
  125.   
  126. part1 = [la0f la0e so0e la0f la0e do1e ...  
  127. do1f re1e do1e la0f la0f ...  
  128. do1f do1e so0e do1e re1e mi1e so1e ...  
  129. so1e mi1e re1f mi1f mi1f ...  
  130. la1e la1e la1e so1e mi1e mi1f do1e ...  
  131. la0e la0e la0e mi1e re1s mi1s re1e re1f ...  
  132. mi1e mi1e so1e mi1e re1e mi1e re1e do1e ...  
  133. la0f so0f la0f la0f ...  
  134. ];  
  135.   
  136. part2 = [mi1e mi1e so1e mi1e mi1e so1e so1e la1e ...   
  137. do2e la1e so1f la1s do2s la1e la1f ...  
  138. la0f la0e so0e la0f do1f ...  
  139. re1e mi1s re1s do1e re1e mi1f mi1f ...  
  140. la0e la1e la1e so1e re1e mi1s re1s do1e re1e ...  
  141. mi1f mi1f blke blke blkf ...  
  142. do1e la0e la0e do1e re1f so0e so0e ...  
  143. mi1e so1e mi1e re1e do1f do1f ...  
  144. la0e do1e re1e mi1e re1e do1e so0e mi0e ...  
  145. la0f la0f blke blke blkf ...  
  146. ];  
  147.   
  148. part3 = [la0f la0e so0e la0f do1f ...  
  149. re1e mi1s re1s do1e re1e mi1f mi1f ...  
  150. la0e la1e la1e so1e re1e mi1s re1s do1e re1e ...  
  151. mi1f mi1f blke blke blkf ...  
  152. do1e la0e la0e do1e re1f so0e so0e ...  
  153. mi1e so1e mi1e re1e do1f do1e do1e ...  
  154. la0e do1e re1e mi1e so1e mi1e mi1e so1e ...  
  155. la1f la1f la1f la1f ...  
  156. ];  
  157.   
  158. part4 = [la1e la1s la1s la1e la1e la1e la1s so1s mi1e re1e ...  
  159. re1e re1s re1s mi1e mi1s so1s mi1e mi1s re1s do1e do1s la0s ...  
  160. la0f la0e so0e la0f la0e do1e ...  
  161. re1e mi1s re1s do1e re1e mi1f mi1f ...  
  162. la1e so1e mi1e re1e so1e mi1e re1e do1e ...  
  163. do1f do1f la0s do1s re1s mi1s re1s do1s la0s do1s  
  164. ];  
  165.   
  166. part5 = [do2e do2s do2s la1e la1s la1s so1e so1s so1s mi1e mi1s mi1s ...  
  167. re1e mi1s re1s do1e la0s so0s la0s so0s do1s re1s mi1s so1s la1s re2s ...  
  168. do2f do2f blks blks blks blks do1e re1e ...  
  169. mi1f mi1f mi1f so1e mi1e ...  
  170. la1f la1f la1e do1e so1e mi1e ...  
  171. re1f re1e re1s re1s re1e re1e do1e re1e ...  
  172. mi1f mi1e mi1s mi1s mi1e re1s do1s ti0e do1s re1s ...  
  173. mi1f mi1f mi1f so1e mi1e ...  
  174. do2f la1f la1f la1e do1e ...  
  175. re1f so1f so1f la1f ...  
  176. ti1f ti1f ti1f ti1f ...  
  177. ];  
  178.   
  179. part6 = [blkf blkf mi1e so1e mi1e so1e ...  
  180. mi1f la0e la0s la0s do1f la0e mi1s la0s ...  
  181. do1e do1s do1s re1e do1s re1s mi1f mi1f ...  
  182. mi1f la0e la0s la0s so1f re1e re1s re1s ...  
  183. mi1f mi1f mi1s re1s do1s la0s mi0s re0s mi0s so0s ...  
  184. do1f la0e la0s la0s re1f so0e so0s so0s ...  
  185. mi0f so0e so0s so0s do1f do1f ...  
  186. la0f do1e do1s la0s mi1e mi1s mi1s re1e re1s mi1s ...  
  187. ];  
  188.   
  189. % Combination, v1 is complete version, v2 is simple version.  
  190. v1 = [part0 part1 part1 part2 part3 part4 part0 part1 part1 part2 part3 part5 part3 part6 part3];  
  191. v2 = [part0 part1 part1 part2 part3 part5 part3 part6 part3];  
  192.   
  193. % Let's rock ^_^  
  194. s = v1;  
  195. s = s/max(s);  
  196. sound(s,fs);  

 

Matlab 制作《最炫民族风》弱爆了,附代码_第1张图片




前两天在网上看到了有人用matlab演奏出最炫民族风,我用了这么多年matlab还是第一次知道有这种玩法,于是把他的代码研究了一下,自己制作了一首歌曲,在这里分享一下。
  首先介绍matlab函数的玩法:
  matlab播放音乐是由sound(Y,fs,bits)函数完成的,该函数的3个参数代表输入信号、采样率、比特率。先说采样率fs的设置,人耳能够听到的声音范围是20~20000Hz。根据采样定理fs只需要大于40000即可。此处采样率的设置采用了MP3的标准,即fs=44.1k.再说输入信号Y,Y一般是一个正弦波,如A*sin(2*pi*w*t)。其中A控制着声音的大小,w控制着声音的高低,t的范围控制着声音的长短,所以理论上利用这个公式可以发出任何声音,只是不能控制音色和音质(音色音质很难用参数量化,我问了一下学语音的同学,这个东西跟音频谱重心,音频扩展度和音频谱平坦度有关系,这里不作讨论)。比特率采用默认值即可,该参数省略。
  于是用下面的公式就可以播放出标准音la:(座机电话提示音就是la,可以用来调吉他)
fs=44100;
t=0: 1/fs: 0.5;
la = sin(2*pi*440*t); (下文介绍440是怎么来的)
sound(la, fs)
 
下面介绍一下简单乐理:
看过柯南的同学都知道,音高和频率是指数的关系,它们满足下面的公式,其中p是音高,f是频率

f=440 * 2(p-69)/12,这就是著名的十二平均率。
标准音la,即钢琴的A4键,定义为p=69。音高每上升一个半音,p加1。
如上图所示,从C4到B4分别对应着do re mi fa sol la xi,它们的p值分别为 60 62 64 65 67 69 71,注意中间有黑键,你也可以根据下表来查询某个音的频率。

Frequency in hertz (semitones above or below middle C)
Octave→
Note↓
0 1 2 3 4 5 6 7 8 9
C 16.352 (−48) 32.703 (−36) 65.406 (−24) 130.81 (−12) 261.63 (0) 523.25 (+12) 1046.5 (+24) 2093.0 (+36) 4186.0 (+48) 8372.0 (+60)
C♯/D♭ 17.324 (−47) 34.648 (−35) 69.296 (−23) 138.59 (−11) 277.18 (+1) 554.37 (+13) 1108.7 (+25) 2217.5 (+37) 4434.9 (+49) 8869.8 (+61)
D 18.354 (−46) 36.708 (−34) 73.416 (−22) 146.83 (−10) 293.66 (+2) 587.33 (+14) 1174.7 (+26) 2349.3 (+38) 4698.6 (+50) 9397.3 (+62)
D♯/E♭ 19.445 (−45) 38.891 (−33) 77.782 (−21) 155.56 (−9) 311.13 (+3) 622.25 (+15) 1244.5 (+27) 2489.0 (+39) 4978.0 (+51) 9956.1 (+63)
E 20.602 (−44) 41.203 (−32) 82.407 (−20) 164.81 (−8) 329.63 (+4) 659.26 (+16) 1318.5 (+28) 2637.0 (+40) 5274.0 (+52) 10548 (+64)
F 21.827 (−43) 43.654 (−31) 87.307 (−19) 174.61 (−7) 349.23 (+5) 698.46 (+17) 1396.9 (+29) 2793.8 (+41) 5587.7 (+53) 11175 (+65)
F♯/G♭ 23.125 (−42) 46.249 (−30) 92.499 (−18) 185.00 (−6) 369.99 (+6) 739.99 (+18) 1480.0 (+30) 2960.0 (+42) 5919.9 (+54) 11840 (+66)
G 24.500 (−41) 48.999 (−29) 97.999 (−17) 196.00 (−5) 392.00 (+7) 783.99 (+19) 1568.0 (+31) 3136.0 (+43) 6271.9 (+55) 12544 (+67)
G♯/A♭ 25.957 (−40) 51.913 (−28) 103.83 (−16) 207.65 (−4) 415.30 (+8) 830.61 (+20) 1661.2 (+32) 3322.4 (+44) 6644.9 (+56) 13290 (+68)
A 27.500 (−39) 55.000 (−27) 110.00 (−15) 220.00 (−3) 440.00 (+9) 880.00 (+21) 1760.0 (+33) 3520.0 (+45) 7040.0 (+57) 14080 (+69)
A♯/B♭ 29.135 (−38) 58.270 (−26) 116.54 (−14) 233.08 (−2) 466.16 (+10) 932.33 (+22) 1864.7 (+34) 3729.3 (+46) 7458.6 (+58) 14917 (+70)
B 30.868 (−37) 61.735 (−25) 123.47 (−13) 246.94 (−1) 493.88 (+11) 987.77 (+23) 1975.5 (+35) 3951.1 (+47) 7902.1 (+59) 15804 (+71)
有了上面的基础,下面就可以用matlab创作歌曲了,这里以李健的传奇作为示例:(喜欢李健的可以加我好友~~)
clc
clear
fs=44100;
t=0:1/fs:0.5;
 
e3_2=key(52, 2, fs); %表示2分音符的e3
a3_2=key(57, 2, fs);
c4_2=key(60, 2, fs);
e4_2=key(52, 2, fs);
g3_2=key(55, 2, fs);
d4_2=key(62, 2, fs);
e4_2=key(64, 2, fs);
g4_2=key(67, 2, fs);
 
e4_4=key(52, 4, fs);
g3_4=key(55, 4, fs);
a3_4=key(57, 4, fs);
b3_4=key(59, 4, fs);
c4_4=key(60, 4, fs);
d4_4=key(62, 4, fs);
e4_4=key(64, 4, fs);
f4_4=key(65, 4, fs);
g4_4=key(67, 4, fs);
a4_4=key(69, 4, fs);
 
e3_8=key(52, 8, fs);
g3_8=key(55, 8, fs);
a3_8=key(57, 8, fs);
b3_8=key(59, 8, fs);
c4_8=key(60, 8, fs);
d4_8=key(62, 8, fs);
e4_8=key(64, 8, fs);
f4_8=key(65, 8, fs);
g4_8=key(67, 8, fs);
a4_8=key(69, 8, fs);
b4_8=key(71, 8, fs);
 
part1=[c4_8 c4_8 c4_4 e4_4 d4_4 d4_8 d4_4 c4_4 c4_8];
part2=[d4_4 d4_4 c4_8 a3_8 a3_2];
part3=[b3_8 b3_8 b3_4 c4_8 d4_8 d4_4];
part4=[b3_4 a3_8 g3_4 e3_8 e3_2 e3_2];
part5=[e4_8 d4_8 e4_4 d4_8 d4_8 d4_4 d4_8 c4_8 c4_2    d4_4 a3_4 a3_8 a3_8 d4_8 c4_8 c4_2];
part6=[d4_4 a3_8 g3_4 g3_8 e3_2 e3_2];
part7=[g4_4 g4_8 d4_8 d4_4 e4_4 g4_4 g4_8 d4_8 d4_4 c4_4 a3_2 a3_2]; 
part8=[d4_4 d4_8 a3_8 a3_4 e4_4 d4_4 d4_8 c4_8 c4_4];
part9=[c4_8 c4_8 c4_4 g3_8 c4_8 c4_4 g4_4 f4_4 e4_4 d4_4 d4_8 c4_8 c4_2 c4_4];
part10=[c4_8 e4_8 g4_8 a4_4 g4_8 a4_4 g4_4 g4_8 a4_4];
 
para1=[part1 part2 part3 part4];
para2=[part5 part3 part6];
para3=[part7 part8 c4_4 g3_2 g3_2];
para4=[part7 part8 c4_8 d4_8 d4_2 d4_2];
para5=[part9 part10 g4_8 e4_8 e4_8 d4_4 e4_8 e4_2];
para6=[part9 part10 g4_4 e4_8 g4_4 g4_8 g4_2];
 
legend=[para1 para2 para3 para4 para5 para6];
sound(legend,fs)
 
其中有两个函数:
function g=key(p, n, fs)
t=0 : 1/fs : 2/n;
g=sin(2*pi* fre(p) *t);
 
function f = fre(p)
f=440*2^((p-69)/12);

你可能感兴趣的:(matlab)