找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STC單片機音源制作進程(日記)

查看數(shù): 6218 | 評論數(shù): 19 | 收藏 6
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2021-9-25 22:57

正文摘要:

     昨天(24-09-2021)已完成了一款用STC8G制作的音源,整個制作過程繁雜,回頭再看很多方法已經(jīng)忘記了,為了能重復(fù)整個制作過程,我將分幾日將原理和程序逐步梳理,寫在論壇就不會再忘記了。 ...

回復(fù)

ID:106060 發(fā)表于 2022-1-16 16:20
如果真的想做,51單片機可能真的無法滿足你們的要求,有個DSP或者FPGA了解一下。
ID:495990 發(fā)表于 2022-1-4 09:46
樓主很牛,這要有相當(dāng)?shù)囊魳穼I(yè)知識才能看得懂哦!
ID:992668 發(fā)表于 2021-12-15 12:15
玩單片機也玩midi的人很少,方便加個
ID:887734 發(fā)表于 2021-10-2 22:31
用單片機玩解碼midi音樂播放的人不多,要有音樂和單片機的多方位能力,樓主的東西很扎實,很好,學(xué)習(xí)了。
要是能年輕10歲我一定好好研究一下這個東西。我是60后,玩不動了,呵呵。。。

ID:283954 發(fā)表于 2021-10-2 16:54
syjldz 發(fā)表于 2021-10-2 06:29
附件里是2通道一種音色的聲音效果,見笑了,stc11f02的性能確實有限。

聽起來還很不錯,而且是兩個聲部,同時發(fā)兩個音,那就是有multitasking的能力,估計再多幾個聲部MCU就來不及了,不過現(xiàn)在MCU速度快多了,可以再嘗試,有四個聲部就有實用價值了,因為一個和弦必須用四個音組成。

音源開發(fā)還有另一條路線圖,就是采用網(wǎng)上易得的SOUNDFONT格式,文件后輟是.sf2,原理是長音符都采用重復(fù)播放部分的方式,所以文件很小,128種樂器就30M,而聲音也不錯了。你若能寫個能解讀.SF2的代碼,就能造出完整的音源,而不必用我這個笨方法了。

這是用.SF2演奏的: hsymp3.zip (4.94 MB, 下載次數(shù): 17)
ID:887734 發(fā)表于 2021-10-2 06:29
附件里是2通道一種音色的聲音效果,見笑了,stc11f02的性能確實有限。

01.rar

3.46 MB, 下載次數(shù): 10, 下載積分: 黑幣 -5

2通道示例音頻

ID:283954 發(fā)表于 2021-10-2 03:46
syjldz 發(fā)表于 2021-10-1 10:45
2012年用stc11f02單片機做過midi 的播放程序,midi文件存儲在EEROM 25P40里面,參考的是一本日文雜志上的文 ...

市售的音源必須至少有16個聲道,必須能同時發(fā)24個音以上,還要有128種樂器的聲音。這不是一般的單片機能做到,而且必須能對幾十種控制訊號做反應(yīng),對CPU的運算能力要求很高。所以你用STC單片機做的只能2聲道,1種樂器。
市面通行的音源芯片只有三顆:SAM2695, VS1053B, CS9326,我都有做過,但聲音都不滿意,很多樂器的聲音都不像,不能作為表演用,因此我必須從最底層做起,連音色文件都要自己制作才行。
ID:887734 發(fā)表于 2021-10-1 10:45
2012年用stc11f02單片機做過midi 的播放程序,midi文件存儲在EEROM 25P40里面,參考的是一本日文雜志上的文章,由于單片機資源有限只做了一個鋼琴音色,2個通道,聲音效果一般,不過midi音樂文件要簡化到2個通道才能用。
附件的文件是效果音,以前的東西好多資料都沒有了,看樓主都東西比我的要好太多了。

ID:283954 發(fā)表于 2021-9-30 16:32
MIDI文件很小,只是記錄音符和音符的時長,但要播放出好聲音,要有好的音源,現(xiàn)在都用軟音源,聲音還不錯,sam2695原本是打算給玩具用的,意外成功,但音色不佳,不能用來當(dāng)演奏用,玩玩可以。這晶片太小,手工焊接很難成功,我做了10片只有7片有聲音,打算驗證線路正確后,讓廠家小批量生產(chǎn)。

我把經(jīng)過格式化的音源文件存入SD卡后,用單片機載入大容量RAM再播放出來。
ID:147710 發(fā)表于 2021-9-30 12:00
很多年前用電腦玩過MIDI,音色不錯,文件又小,看到大佬的帖子,手癢癢,準(zhǔn)備弄片SAM2695玩玩,看那封裝,真有點猶豫,大佬的音源是放在SD卡里么
ID:887734 發(fā)表于 2021-9-27 21:17
好東西,坐等更新。。。。。。
ID:283954 發(fā)表于 2021-9-27 16:39
      昨天用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ù)



ID:276663 發(fā)表于 2021-9-26 09:21
kdg,還沒看懂你要干啥

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表