用于线程的音乐库[关闭]

Posted

技术标签:

【中文标题】用于线程的音乐库[关闭]【英文标题】:Music library for using with threads [closed] 【发布时间】:2011-03-02 16:20:05 【问题描述】:

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

但我想将它与线程一起使用,一个线程播放声音,而另一个线程播放其他声音。

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

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

任何想法、经验、图书馆或信息都会有所帮助,在此先感谢!

【问题讨论】:

我很犹豫是否将其发布为实际答案,但您也许可以从我的相关 codegolf 答案中收集一两个关于如何实施@Tyler 答案的想法:codegolf.stackexchange.com/questions/272/… 由于您没有提及特定的操作系统,我建议您查看 fmod (fmod.org/index.php/download)。 @mootinator 感谢您的参考,@yms.cu 我会检查它 【参考方案1】:

我不认为线程是你想要的。同步太难了。您可能想要做的(以及几年前我为类似的应用程序所做的)是维护活动笔记的数据结构(可以使用类实例或闭包或任何有效的方法来实现),并且对于每个示例,调用每个结构中的项目,对输出求和(我建议此时使用带符号的 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 分钟),我可以通过一两个简单的音符获得实时,但不能更多。

【讨论】:

您使用什么语言/库进行声音输出? 这是某种 MacAudio 模块。请记住,这是 OS8.6 下的 Python 1.5.2,因此与现代情况完全不相关。这些天我可能会关注 OpenAL 或 SDL 之类的东西。【参考方案2】:

您可能想看看GStreamer framework。它允许您将音频流建模为由元素组成的“管道”。并行元素将在不同的线程中自动处理。元素可以使用“时钟”保持同步。

看看manual。前 10 章将为您提供对可能性的一个很好的概述。 (而且读起来很快。)

查看list of plugins 似乎有一些对midi 的支持。

【讨论】:

【参考方案3】:

jMusic 似乎有一个综合库。他们网站上的links 页面也有更多资源。 [n.b.我没有在愤怒中使用它;几年前我看过它,然后转而选择了商业包...]

hth,R

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

    线程同步函数 GUI 构建和图形功能 支持 VST 插件 Midi 支持 双重许可(GPL 2.0 或专有许可)允许您重新分发您的工作或编写封闭源代码应用程序。

很多专业的音频应用都是用这个库写的,比如 MAX/MSP (http://en.wikipedia.org/wiki/Max_%28software%29)

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于用于线程的音乐库[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用于音乐创作的高级编程语言 [关闭]

是否有用于音乐信息(专辑、艺术家、曲目)的免费数据库或网络服务 API? [关闭]

如何在实时应用程序中锁定线程[关闭]

用于运行异步请求的 Python Celery 与线程库 [关闭]

如何正确的关闭 MFC 线程

快速需要关闭音频层