iOS AUSampler 连续播放 MIDI 音符

Posted

技术标签:

【中文标题】iOS AUSampler 连续播放 MIDI 音符【英文标题】:iOS AUSampler Play midi note continuously 【发布时间】:2014-01-18 12:18:06 【问题描述】:

我正在尝试使用AUSampler audio unit 在 sf2 文件的帮助下播放 MIDI 音符。我能够使用MusicDeviceMIDIEvent 函数很好地开始和停止笔记,如下所示。

noteCommand =   kMIDIMessage_NoteOn << 4 | 0;
MusicDeviceMIDIEvent (samplerUnit, noteCommand, note, velocity, 0);

即使我没有使用 NoteOff 消息调用 MusicDeviceMIDIEvent 函数,该注释也会在某个时间后停止。

在我用 NoteOff 调用 MusicDeviceMIDIEvent 之前,有什么方法可以播放这个音符?还是应该以不同的方式创建 sf2 文件,以便它包含用于音符攻击、音符延音等的不同声音文件,并且 AUSampler 单元会自动处理播放延音直到调用 NoteOff?

谢谢。

【问题讨论】:

【参考方案1】:

如果你使用它们,你需要在你的 sf2 文件或 AUPreset 中设置它。对于 AUPresets,这里是 Apple 的Tech Note TN2283:

使用区域列表属性指定循环 (kAudioFilePropertyRegionList) 描述一段循环音频 数据,并且可以使用 AudioFileSetProperty API 进行设置。

这是一个long tutorial,关于使用 Garageband 设置循环 AUSampler。 AU Lab 也可以生成 AUPresets。

对于 sf2,youtube 视频展示了如何设置循环。不清楚他用的是什么软件。如果您喜欢冒险,可以尝试为 OSX 构建开源 Swami

【讨论】:

非常感谢汤姆!我将尝试获取 sf2 指定循环区域并查看。 我在采样器单元的属性下找到了这个“kAUGroupParameterID_Sustain”参数..这有什么帮助吗? 我试过设置这个参数。AudioUnitSetParameter(auSamplerUnit, kAUGroupParameterID_Volume, kAudioUnitScope_Global, 0, someValue, 0) 但这总是失败并出现“-10878”错误。 我自己还没有这样做 - 但错误代码是 kAudioUnitErr_InvalidParameter - (developer.apple.com/library/mac/documentation/AudioUnit/…) - 所以检查你传递的参数 - 还不够吗?太多?错误的类型?等等

以上是关于iOS AUSampler 连续播放 MIDI 音符的主要内容,如果未能解决你的问题,请参考以下文章

在 MIDI 上播放连续的类似 theremin 的声音

如何将从音轨 1 提取的速度应用到 MIDI 文件的其他音轨?

iOS如何播放midi音符?

如何在 MIDI 文件中嵌入控制更改命令

在 python 中构建 MIDI 合并程序,带有恢复选项

如何从 MIDI 序列中获取 Note On/Off 消息?