楼主: niuniuyiwan
1751 2

[程序分享] [MATLAB] The bright eleven - Old Boys 老男孩 [推广有奖]

  • 7关注
  • 91粉丝

VIP

已卖:1980份资源

学科带头人

91%

还不是VIP/贵宾

-

威望
0
论坛币
14447 个
通用积分
1962.5650
学术水平
1119 点
热心指数
1167 点
信用等级
1061 点
经验
8523 点
帖子
1629
精华
1
在线时间
2494 小时
注册时间
2010-10-10
最后登录
2026-1-21

楼主
niuniuyiwan 在职认证  发表于 2015-7-10 08:16:32 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

本贴转自:http://blog.renren.com/share/251000425/13114716344

                                                                    The bright eleven - Old Boys 老男孩
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % 最近看到大家分享各种matlab版的音乐,卡农、最炫民族风等等
  3. % 巧的是08级种子班大三上学期的《数字信号处理》课程设计正是一个简易的音乐合成器
  4. % 通过乐谱文件合成音乐
  5. % 以下即是
  6. % 筷子兄弟——《老男孩》
  7. % 的播放程序
  8. % 运行方法:
  9. % 将以下代码保存为oldboy.m,在matlab中找到该文件所在目录,直接命令行运行oldboy
  10. % 注:程序中的乐谱由本班金晓龙同学提供
  11. % just for fun~
  12. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  13. %%% oldboy.m %%%
  14. % 主程序
  15. % 课设中的做法是:读取音乐乐谱,并合成音乐,保存在文件中
  16. % 这里为图方便,直接把乐谱写死在程序中了

  17. function oldboy

  18. %load('old_boy.mat'); %读取乐谱文件,歌曲《老男孩》

  19. fs = 11025; % the frequency of sampling
  20. bpm = 120; % beats per minute
  21. beats_per_second = bpm/60; % beats per second
  22. seconds_per_beat = 1/beats_per_second; % seconds per beat
  23. seconds_per_pulse = seconds_per_beat / 4; % seconds per pulse

  24. % 获取音乐的键值和节拍长度
  25. % mymusic.keys = theVoices(1).noteNumbers;
  26. % mymusic.durations = theVoices(1).durations * seconds_per_pulse;
  27. mymusic.keys = [47,47,47,47,47,49,47,45,44,49,51,52,51,47,0,47,47,49,40,40,42,44,47,0,47,45,47,44,42,40,42,47,47,47,47,47,49,47,45,44,49,51,52,51,47,0,47,47,49,40,40,42,44,47,0,47,45,47,44,42,40,40,52,51,49,51,52,54,56,51,47,47,49,56,56,54,52,52,52,51,49,51,52,54,56,51,47,47,49,56,56,54,52,52,0,52,52,59,59,59,59,59,51,51,47,47,59,59,59,61,59,52,52,52,54,56,54,57,56,56,54,57,56,56,54,57,56,59,0,52,52,59,59,59,59,59,51,51,47,47,59,59,59,61,59,52,52,52,54,56,54,57,56,56,54,52,51,52];
  28. mymusic.durations = [0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.750000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.750000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.750000000000000,0.250000000000000,0.750000000000000,0.250000000000000,0.250000000000000,0.250000000000000,0.500000000000000,2,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.750000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.750000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.750000000000000,0.250000000000000,0.750000000000000,0.250000000000000,0.250000000000000,0.250000000000000,0.500000000000000,2,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.500000000000000,1,0.250000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.250000000000000,0.500000000000000,1,0.500000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,1,0.250000000000000,0.250000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.500000000000000,0.500000000000000,1,0.500000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,1,0.500000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.250000000000000,0.250000000000000,0.500000000000000,0.250000000000000,0.750000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,0.500000000000000,3];

  29. xx = zeros(1, floor(sum(mymusic.durations)+1)*fs + length(mymusic.keys)); %输出正弦波

  30. n1 = 1;
  31. for kk = 1:length(mymusic.keys)
  32. keynum = mymusic.keys(kk);
  33. tone = key2note(1, keynum, mymusic.durations(kk), fs); %根据一个音符的keynum和持续时间生成正弦波
  34. n2 = n1 + length(tone) - 1;
  35. xx(n1:n2) = xx(n1:n2) + tone; %将各个音符拼接为连续的音乐
  36. n1 = n2 + 1;
  37. end

  38. %wavwrite(xx, fs, 'old_boy.wav'); %写入到文件old_boy.wav里面
  39. soundsc(xx, fs);

  40. %%% key2note.m %%%
  41. % 根据钢琴键盘的键值合成正弦信号

  42. function xx = key2note(X, keynum, dur, fs)
  43. % KEY2NOTE Produce a sinusoidal waveform corresponding to a
  44. % given piano key number
  45. %
  46. % usage: xx = key2note(X, keynum, dur)
  47. %
  48. % xx = the output sinusoidal waveform
  49. % X = complex amplitude for the sinusoid, X = A*exp(j*phi).
  50. % keynum = the piano keyboard number of the desired note
  51. % dur = the duration (in seconds) of the output note
  52. % fs = the frequency of sampling
  53. %
  54. % fs = 11025; %-- or use 8000Hz
  55. tt = 0:(1/fs):dur;
  56. freq = 440*2^((keynum-49)/12); %<== 将按键值转换为对应的发声频率
  57. %adsr = 1;
  58. adsr = ADSR(dur, fs);
  59. xx = adsr .* real(X*exp(j*2*pi*freq*tt));

  60. %%% ADSR.m %%%
  61. % 根据每个音符的频率和持续时间生成ADSR序列。

  62. function adsr = ADSR(dur, fs)
  63. % usage: X = ADSR(dur, fs)
  64. %
  65. % fs = the frequency of sampling
  66. % dur = the duration (in seconds) of the output note
  67. %
  68. ts = 0:(1/fs):dur;
  69. xxx = [0 4/15*dur 3/15*dur 12.5/15*dur dur];
  70. yyy = [0 6/15*dur 1/3*dur 2/12*dur 0];
  71. adsr = interp1(xxx ,yyy, ts);
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MATLAB Bright matla atlab RIGHT 老男孩

本帖被以下文库推荐

沙发
pilk123 发表于 2015-7-10 08:21:15
知识就是娱乐!!!

藤椅
condmn 发表于 2015-8-11 17:47:50

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 04:41