如果真的想做,51单片机可能真的无法满足你们的要求,有个DSP或者FPGA了解一下。 |
楼主很牛,这要有相当的音乐专业知识才能看得懂哦! |
玩单片机也玩midi的人很少,方便加个 |
用单片机玩解码midi音乐播放的人不多,要有音乐和单片机的多方位能力,楼主的东西很扎实,很好,学习了。 要是能年轻10岁我一定好好研究一下这个东西。我是60后,玩不动了,呵呵。。。 |
syjldz 发表于 2021-10-2 06:29 听起来还很不错,而且是两个声部,同时发两个音,那就是有multitasking的能力,估计再多几个声部MCU就来不及了,不过现在MCU速度快多了,可以再尝试,有四个声部就有实用价值了,因为一个和弦必须用四个音组成。 音源开发还有另一条路线图,就是采用网上易得的SOUNDFONT格式,文件后辍是.sf2,原理是长音符都采用重复播放部分的方式,所以文件很小,128种乐器就30M,而声音也不错了。你若能写个能解读.SF2的代码,就能造出完整的音源,而不必用我这个笨方法了。 这是用.SF2演奏的: |
syjldz 发表于 2021-10-1 10:45 市售的音源必须至少有16个声道,必须能同时发24个音以上,还要有128种乐器的声音。这不是一般的单片机能做到,而且必须能对几十种控制讯号做反应,对CPU的运算能力要求很高。所以你用STC单片机做的只能2声道,1种乐器。 市面通行的音源芯片只有三颗:SAM2695, VS1053B, CS9326,我都有做过,但声音都不满意,很多乐器的声音都不像,不能作为表演用,因此我必须从最底层做起,连音色文件都要自己制作才行。 |
2012年用stc11f02单片机做过midi 的播放程序,midi文件存储在EEROM 25P40里面,参考的是一本日文杂志上的文章,由于单片机资源有限只做了一个钢琴音色,2个通道,声音效果一般,不过midi音乐文件要简化到2个通道才能用。 附件的文件是效果音,以前的东西好多资料都没有了,看楼主都东西比我的要好太多了。 |
MIDI文件很小,只是记录音符和音符的时长,但要播放出好声音,要有好的音源,现在都用软音源,声音还不错,sam2695原本是打算给玩具用的,意外成功,但音色不佳,不能用来当演奏用,玩玩可以。这晶片太小,手工焊接很难成功,我做了10片只有7片有声音,打算验证线路正确后,让厂家小批量生产。 我把经过格式化的音源文件存入SD卡后,用单片机载入大容量RAM再播放出来。 |
很多年前用电脑玩过MIDI,音色不错,文件又小,看到大佬的帖子,手痒痒,准备弄片SAM2695玩玩,看那封装,真有点犹豫,大佬的音源是放在SD卡里么 |
好东西,坐等更新。。。。。。 |
昨天用GOLDWAVE把85个音符都做了标记,总共花费25分钟才做完,如果要把128种音色都做完的话,那就得花25分钟X128除60=53小时才能做完,真的是三天三夜不眠不吃不喝还得精神饱满才能做完,所以还得相出其他办法,否则是无法做出全部音色的。 经过标记的音色文件,就可以用程序来做切割成85个音符,要写出一个能一次过切割文件的程序也不容易,因此就分几步走,第一步是读取文件后产生一个MAP的文件,注释每个音符在文件里的位置: mapfile.bas CLS VL=8 FL$="FLUTE.WAV" OPEN FL$ FOR BINARY AS #1 'FIND THE WORD "DATA" PRINT "PROCESSING FILE ";FL$;" LEN=";LOF(1) FOR I&=0 TO 1000 'LOF(1) GET$ #1,4, RING$ IF RING$="data" THEN PRINT "FOUND THE WORD data AT LOCATION:";LOC(1); " SO, IT IS A WAV FILE" EXIT FOR END IF K=LOC(1) K=K-3 SEEK #1, K NEXT I& CLOSE #1 VER$="CUTHERE!" OPEN FL$ FOR BINARY AS #1 'FIND VER$ MARK AS 000000000(38BYTES) OPEN "MAP.TXT" FOR OUTPUT AS #2 PRINT "ORIGINAL FILE ";FL$;" LEN=";LOF(1) B&=LOF(1)/VL 'LOOP HOW MANY TIME N=9 'START FILE NAME AT NUMBER 9 FOR I&=0 TO LOF(1) LOCATE 7, 1 PRINT I& IF EOF(1) THEN EXIT FOR END IF GET$ #1,VL, RING$ IF RING$=VER$ THEN N=N+1 OL&=LOC(1)-OL& PRINT #2, N;LOC(1);OL& LOCATE 5, 1 PRINT "FOUND VER$ AT";LOC(1);"SIZE=";OL&;" NUMBER=";N;" LOOP=";I& OL&=LOC(1) GET$ #1,64, USELESS$ 'MOVE FORWARD TO AVIOD DOUBLE END IF K&=LOC(1) K&=K&-7 SEEK #1, K& NEXT I& CLOSE #1 CLOSE #2 END 运行后得到MAP.TXT的文件,内容如下: 10 2252344 2252344 11 3667072 1414728 12 5079052 1411980 13 6489384 1410332 14 7901104 1411720 15 9309872 1408768 16 10721256 1411384 17 12131796 1410540 18 13545088 1413292 19 14957832 1412744 20 16368244 1410412 21 17777268 1409024 22 19189964 1412696 23 20600396 1410432 24 22012532 1412136 25 23424380 1411848 26 24834712 1410332 27 26244712 1410000 28 27657152 1412440 29 29069004 1411852 30 30479592 1410588 31 31890980 1411388 32 33302956 1411976 33 34713624 1410668 34 36124548 1410924 35 37535808 1411260 36 38947912 1412104 37 40358964 1411052 38 41769040 1410076 39 43180428 1411388 40 44591816 1411388 41 46003204 1411388 42 47414384 1411180 43 48826824 1412440 44 50237620 1410796 45 51648080 1410460 46 53059468 1411388 47 54470184 1410716 48 55881908 1411724 49 57293884 1411976 50 58704808 1410924 51 60116068 1411260 52 61527120 1411052 53 62938508 1411388 54 64350020 1411512 55 65761152 1411132 56 67172668 1411516 57 68583208 1410540 58 69994260 1411052 59 71406492 1412232 60 72817672 1411180 61 74228548 1410876 62 75640064 1411516 63 77051244 1411180 64 78462836 1411592 65 79873684 1410848 66 81285404 1411720 67 82696664 1411260 68 84108228 1411564 69 85518688 1410460 70 86930412 1411724 71 88340744 1410332 72 89751872 1411128 73 91163772 1411900 74 92574904 1411132 75 93985904 1411000 76 95397804 1411900 77 96808728 1410924 78 98220244 1411516 79 99630784 1410540 80 101041324 1410540 81 102453224 1411900 82 103864612 1411388 83 105276204 1411592 84 106686920 1410716 85 108098644 1411724 86 109509568 1410924 87 110921468 1411900 88 112332468 1411000 89 113743728 1411260 90 115154856 1411128 91 116565832 1410976 92 117977092 1411260 文件中第一列是音符序列码,第二列是该音符在文件中开始的位置,第三列是每个标记之间的大小,大概是1.4M,这数字并不重要,主要是用来查看有没有漏标或多标,除了第一行的数字,其他的都应该接近1.4M这个数字,如有错误必须打开音色文件纠正才能继续。 。。待续 |
kdg,还没看懂你要干啥 |