我想编写播放音乐的节目(音频或midi甚至纯音都可以)
但我想用线程,线程播放声音,而其他线程播放其他声音。
我认为这里的难点在于我想同时输出不同的声音,这是典型的预处理方式,但如果声音的混合可以现场完成,那就变得非常有趣了。
任何想法,经验,图书馆或信息都会有所帮助,提前谢谢!
答案 0 :(得分:5)
我认为线程不是你想要的。同步太难了。您可能想要做的事情(以及我多年前为类似应用程序所做的)是维护活动笔记的数据结构(可以使用类实例,闭包或任何工作实现),并且对于每个样本,调用每个结构中的项目,对输出求和(我建议此时使用带符号的16位数学运算,因此您的值在-32767到+32768的范围内)。只混合各种信号。
如下所示:
#ts = A clock, in eg, seconds, passed in to your calls for generation purposes.
sample = sum([notefunc(ts) for notefunc in notes])
#Now convert the sample to whatever format needed for your media lib
#Update notes array
...并重复该循环44100次/秒。可能需要某种缓冲。实际实时很棘手。回到我玩这个东西的时候(在233mhz G3 Powerbook上大约2000),我可以用一两个简单的音符获得实时,但不能更多。
答案 1 :(得分:2)
您可能需要查看GStreamer framework。它允许您将音频流模型化为由元素组成的“管道”。并行元素将在不同的线程中自动处理。可以使用“时钟”使元素保持同步。
查看manual。前10章将为您提供可能性的概述。 (它读得很快。)
看看list of plugin,似乎有一些支持midi。
答案 2 :(得分:1)
答案 3 :(得分:1)
答案 4 :(得分:1)
考虑使用Juce库(http://www.rawmaterialsoftware.com/juce.php)。
这是一个C ++跨平台库。 除音频功能外,它还有许多不同的功能(http://www.rawmaterialsoftware.com/jucefeatures.php):
许多专业音频应用程序都是用这个库编写的,比如MAX / MSP(http://en.wikipedia.org/wiki/Max_%28software%29)
答案 5 :(得分:1)
我会推荐JFugue。 我自己使用这个库来编写使用多个线程的音乐。
作为一项实验,我调整了一个现有的Piano module,它也在使用JFugue。