用于线程的音乐库

时间:2011-03-02 16:20:06

标签: java c++ multithreading audio

我想编写播放音乐的节目(音频或midi甚至纯音都可以)

但我想用线程,线程播放声音,而其他线程播放其他声音。

  • 线程1 *可以播放不同强度和频率的纯音 (形成一个更复杂的信封,创造声音的“音色”))
  • 线程2 *一组线程1可以在给定的音色中播放不同的音符 (用乐器声音形成和弦)
  • 线程3 *一组线程2可以演奏不同音符的和弦        (代表音乐家)
  • 线程4 *一组线程3可以成为管弦乐队! =)

我认为这里的难点在于我想同时输出不同的声音,这是典型的预处理方式,但如果声音的混合可以现场完成,那就变得非常有趣了。

任何想法,经验,图书馆或信息都会有所帮助,提前谢谢!

6 个答案:

答案 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)

jMusic似乎有一个全面的图书馆。他们网站上的links页面也有更多资源。 [n.b。我没有在愤怒中使用过这个;几年前我看了它,然后去了商业套餐......]

hth,R

答案 3 :(得分:1)

这是一个有趣的blog,它将音乐和软件结合在一起。该博客的This page致力于在音乐软件中使用线程和锁定免费算法,并且有一个库列表。另外here是您感兴趣的另一个列表。

答案 4 :(得分:1)

考虑使用Juce库(http://www.rawmaterialsoftware.com/juce.php)。

这是一个C ++跨平台库。 除音频功能外,它还有许多不同的功能(http://www.rawmaterialsoftware.com/jucefeatures.php):

  1. 线程同步功能
  2. Gui建筑和图形功能
  3. 支持VST插件
  4. Midi支持
  5. 双重许可(GPL 2.0或专有许可)允许您重新分发您的工作或编写闭源应用程序。
  6. 许多专业音频应用程序都是用这个库编写的,比如MAX / MSP(http://en.wikipedia.org/wiki/Max_%28software%29

答案 5 :(得分:1)

我会推荐JFugue。 我自己使用这个库来编写使用多个线程的音乐。

作为一项实验,我调整了一个现有的Piano module,它也在使用JFugue。