我想编写播放音乐的程序(音频或 midi 甚至纯音都可以)
但我想将它与线程一起使用,一个线程播放声音,而另一个线程播放其他声音。
- 线程 1 * 可以播放不同强度和频率的纯音
(形成更复杂的包络,创造声音的“音色”))
- 线程 2 * 一组线程 1 可以在给定的音色中演奏不同的音符
(从乐器声音组成和弦)
- 线程 3 * 一组线程 2 可以用不同的音符演奏和弦
(代表音乐家)
- 线程 4 * 一组线程 3 可以成为管弦乐队! =)
我认为这里最难的部分是我想同时输出不同的声音,这是典型的预处理方式,但如果声音的混合可以现场完成,它就会变得更加有趣。
任何想法、经验、图书馆或信息都会有所帮助,在此先感谢!
我认为线程不是您想要的。同步太困难了。您可能想要做的(以及我几年前为类似应用程序所做的)是维护 Activity 笔记的数据结构(可以用类实例、闭包或任何有效的方法来实现),并为每个示例调用每个结构中的项目,对输出求和(此时我建议使用带符号的 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)我可以通过一两个简单的笔记获得实时,但不能更多。