找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

STC单片机音源制作进程(日记)

查看数: 4750 | 评论数: 19 | 收藏 6
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-9-25 22:57

正文摘要:

     昨天(24-09-2021)已完成了一款用STC8G制作的音源,整个制作过程繁杂,回头再看很多方法已经忘记了,为了能重复整个制作过程,我将分几日将原理和程序逐步梳理,写在论坛就不会再忘记了。 ...

回复

ID:106060 发表于 2022-1-16 16:20
如果真的想做,51单片机可能真的无法满足你们的要求,有个DSP或者FPGA了解一下。
ID:495990 发表于 2022-1-4 09:46
楼主很牛,这要有相当的音乐专业知识才能看得懂哦!
ID:992668 发表于 2021-12-15 12:15
玩单片机也玩midi的人很少,方便加个
ID:887734 发表于 2021-10-2 22:31
用单片机玩解码midi音乐播放的人不多,要有音乐和单片机的多方位能力,楼主的东西很扎实,很好,学习了。
要是能年轻10岁我一定好好研究一下这个东西。我是60后,玩不动了,呵呵。。。

ID:283954 发表于 2021-10-2 16:54
syjldz 发表于 2021-10-2 06:29
附件里是2通道一种音色的声音效果,见笑了,stc11f02的性能确实有限。

听起来还很不错,而且是两个声部,同时发两个音,那就是有multitasking的能力,估计再多几个声部MCU就来不及了,不过现在MCU速度快多了,可以再尝试,有四个声部就有实用价值了,因为一个和弦必须用四个音组成。

音源开发还有另一条路线图,就是采用网上易得的SOUNDFONT格式,文件后辍是.sf2,原理是长音符都采用重复播放部分的方式,所以文件很小,128种乐器就30M,而声音也不错了。你若能写个能解读.SF2的代码,就能造出完整的音源,而不必用我这个笨方法了。

这是用.SF2演奏的: hsymp3.zip (4.94 MB, 下载次数: 17)
ID:887734 发表于 2021-10-2 06:29
附件里是2通道一种音色的声音效果,见笑了,stc11f02的性能确实有限。

01.rar

3.46 MB, 下载次数: 9, 下载积分: 黑币 -5

2通道示例音频

ID:283954 发表于 2021-10-2 03:46
syjldz 发表于 2021-10-1 10:45
2012年用stc11f02单片机做过midi 的播放程序,midi文件存储在EEROM 25P40里面,参考的是一本日文杂志上的文 ...

市售的音源必须至少有16个声道,必须能同时发24个音以上,还要有128种乐器的声音。这不是一般的单片机能做到,而且必须能对几十种控制讯号做反应,对CPU的运算能力要求很高。所以你用STC单片机做的只能2声道,1种乐器。
市面通行的音源芯片只有三颗:SAM2695, VS1053B, CS9326,我都有做过,但声音都不满意,很多乐器的声音都不像,不能作为表演用,因此我必须从最底层做起,连音色文件都要自己制作才行。
ID:887734 发表于 2021-10-1 10:45
2012年用stc11f02单片机做过midi 的播放程序,midi文件存储在EEROM 25P40里面,参考的是一本日文杂志上的文章,由于单片机资源有限只做了一个钢琴音色,2个通道,声音效果一般,不过midi音乐文件要简化到2个通道才能用。
附件的文件是效果音,以前的东西好多资料都没有了,看楼主都东西比我的要好太多了。

ID:283954 发表于 2021-9-30 16:32
MIDI文件很小,只是记录音符和音符的时长,但要播放出好声音,要有好的音源,现在都用软音源,声音还不错,sam2695原本是打算给玩具用的,意外成功,但音色不佳,不能用来当演奏用,玩玩可以。这晶片太小,手工焊接很难成功,我做了10片只有7片有声音,打算验证线路正确后,让厂家小批量生产。

我把经过格式化的音源文件存入SD卡后,用单片机载入大容量RAM再播放出来。
ID:147710 发表于 2021-9-30 12:00
很多年前用电脑玩过MIDI,音色不错,文件又小,看到大佬的帖子,手痒痒,准备弄片SAM2695玩玩,看那封装,真有点犹豫,大佬的音源是放在SD卡里么
ID:887734 发表于 2021-9-27 21:17
好东西,坐等更新。。。。。。
ID:283954 发表于 2021-9-27 16:39
      昨天用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这个数字,如有错误必须打开音色文件纠正才能继续。

。。待续



ID:276663 发表于 2021-9-26 09:21
kdg,还没看懂你要干啥

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表