![]() |
發(fā)布時間: 2021-9-25 22:57
正文摘要:昨天(24-09-2021)已完成了一款用STC8G制作的音源,整個制作過程繁雜,回頭再看很多方法已經(jīng)忘記了,為了能重復(fù)整個制作過程,我將分幾日將原理和程序逐步梳理,寫在論壇就不會再忘記了。 ... |
如果真的想做,51單片機可能真的無法滿足你們的要求,有個DSP或者FPGA了解一下。 |
樓主很牛,這要有相當(dāng)?shù)囊魳穼I(yè)知識才能看得懂哦! |
玩單片機也玩midi的人很少,方便加個 |
用單片機玩解碼midi音樂播放的人不多,要有音樂和單片機的多方位能力,樓主的東西很扎實,很好,學(xué)習(xí)了。 要是能年輕10歲我一定好好研究一下這個東西。我是60后,玩不動了,呵呵。。。 |
syjldz 發(fā)表于 2021-10-2 06:29 聽起來還很不錯,而且是兩個聲部,同時發(fā)兩個音,那就是有multitasking的能力,估計再多幾個聲部MCU就來不及了,不過現(xiàn)在MCU速度快多了,可以再嘗試,有四個聲部就有實用價值了,因為一個和弦必須用四個音組成。 音源開發(fā)還有另一條路線圖,就是采用網(wǎng)上易得的SOUNDFONT格式,文件后輟是.sf2,原理是長音符都采用重復(fù)播放部分的方式,所以文件很小,128種樂器就30M,而聲音也不錯了。你若能寫個能解讀.SF2的代碼,就能造出完整的音源,而不必用我這個笨方法了。 這是用.SF2演奏的: ![]() |
syjldz 發(fā)表于 2021-10-1 10:45 市售的音源必須至少有16個聲道,必須能同時發(fā)24個音以上,還要有128種樂器的聲音。這不是一般的單片機能做到,而且必須能對幾十種控制訊號做反應(yīng),對CPU的運算能力要求很高。所以你用STC單片機做的只能2聲道,1種樂器。 市面通行的音源芯片只有三顆:SAM2695, VS1053B, CS9326,我都有做過,但聲音都不滿意,很多樂器的聲音都不像,不能作為表演用,因此我必須從最底層做起,連音色文件都要自己制作才行。 |
2012年用stc11f02單片機做過midi 的播放程序,midi文件存儲在EEROM 25P40里面,參考的是一本日文雜志上的文章,由于單片機資源有限只做了一個鋼琴音色,2個通道,聲音效果一般,不過midi音樂文件要簡化到2個通道才能用。 附件的文件是效果音,以前的東西好多資料都沒有了,看樓主都東西比我的要好太多了。 |
MIDI文件很小,只是記錄音符和音符的時長,但要播放出好聲音,要有好的音源,現(xiàn)在都用軟音源,聲音還不錯,sam2695原本是打算給玩具用的,意外成功,但音色不佳,不能用來當(dāng)演奏用,玩玩可以。這晶片太小,手工焊接很難成功,我做了10片只有7片有聲音,打算驗證線路正確后,讓廠家小批量生產(chǎn)。 我把經(jīng)過格式化的音源文件存入SD卡后,用單片機載入大容量RAM再播放出來。 |
很多年前用電腦玩過MIDI,音色不錯,文件又小,看到大佬的帖子,手癢癢,準(zhǔn)備弄片SAM2695玩玩,看那封裝,真有點猶豫,大佬的音源是放在SD卡里么 |
好東西,坐等更新。。。。。。 |
昨天用GOLDWAVE把85個音符都做了標(biāo)記,總共花費25分鐘才做完,如果要把128種音色都做完的話,那就得花25分鐘X128除60=53小時才能做完,真的是三天三夜不眠不吃不喝還得精神飽滿才能做完,所以還得相出其他辦法,否則是無法做出全部音色的。 經(jīng)過標(biāo)記的音色文件,就可以用程序來做切割成85個音符,要寫出一個能一次過切割文件的程序也不容易,因此就分幾步走,第一步是讀取文件后產(chǎn)生一個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的文件,內(nèi)容如下: 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 文件中第一列是音符序列碼,第二列是該音符在文件中開始的位置,第三列是每個標(biāo)記之間的大小,大概是1.4M,這數(shù)字并不重要,主要是用來查看有沒有漏標(biāo)或多標(biāo),除了第一行的數(shù)字,其他的都應(yīng)該接近1.4M這個數(shù)字,如有錯誤必須打開音色文件糾正才能繼續(xù)。 。。待續(xù) |
kdg,還沒看懂你要干啥 |
Powered by 單片機教程網(wǎng)