gpt4 book ai didi

ios - 音频时间戳格式 + 'MusicDeviceMIDIEvent'

转载 作者:可可西里 更新时间:2023-11-01 03:57:28 28 4
gpt4 key购买 nike

我能得到一点帮助吗?

在一个测试项目中,我有一个 AUSampler -> MixerUnit -> ioUnit 并设置了渲染回调。一切正常。我正在使用 MusicDevice.h 中定义的 MusicDeviceMIDIEvent 方法来播放 midi noteOn 和 noteOff。所以在下面的黑客测试代码中,noteOn 发生了 0.5 秒。每 2 秒一次。

MusicDeviceMIDIEvent(下方)采用参数:inOffsetSampleFrame 以便在未来时间安排事件。我希望能够做的是同时播放 noteOn 和安排 noteOff(没有我在下面进行的 hack 时间检查)。我只是不明白 inOffsetSampleFrame 的值应该是多少(例如:播放 0.5 秒或 0.2 秒的音符。(换句话说,我不明白音频计时的基础知识。 ..).

因此,如果有人可以引导我完成算术运算以从传入的 AudioTimeStamp 中获取正确的值,那就太好了!也可能纠正我/澄清任何这些:

  1. AudioTimeStamp->mSampleTime - sampleTime 是时间当前样本“切片”?这是以毫秒为单位吗?

  2. AudioTimeStamp->mHostTime - ?主机是应用程序运行的计算机,这是计算机启动后的时间(以毫秒为单位?)?这是一个巨大的数字。不会翻车然后出问题吗?

  3. inNumberFrames - 在 iOS5 上似乎是 512(通过设置kAudioUnitProperty_MaximumFramesPerSlice)。于是制作了 sample 最多 512 帧?

  4. 我看到很多告诫不要让渲染回调过载函数——特别是为了避免 Objective C 调用——我理解原因,但是如何向 UI 发送消息或执行其他操作处理?

我想就是这样。谢谢你的包容!

inOffsetSampleFrame If you are scheduling the MIDI Event from the audio unit's render thread, then you can supply a sample offset that the audio unit may apply when applying that event in its next audio unit render. This allows you to schedule to the sample, the time when a MIDI command is applied and is particularly important when starting new notes. If you are not scheduling in the audio unit's render thread, then you should set this value to 0

//MusicDeviceMIDIEvent 函数定义:

extern OSStatus
MusicDeviceMIDIEvent( MusicDeviceComponent inUnit,
UInt32 inStatus,
UInt32 inData1,
UInt32 inData2,
UInt32 inOffsetSampleFrame)

//我的回调

OSStatus  MyCallback(   void *                          inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData)
{

Float64 sampleTime = inTimeStamp->mSampleTime;
UInt64 hostTime = inTimeStamp->mHostTime;

[(__bridge Audio*)inRefCon audioEvent:sampleTime andHostTime:hostTime];

return 1;
}

//OBJ-C 方法

- (void)audioEvent:(Float64) sampleTime andHostTime:(UInt64)hostTime
{
OSStatus result = noErr;

Float64 nowTime = (sampleTime/self.graphSampleRate); // sample rate: 44100.0
if (nowTime - lastTime > 2) {

UInt32 noteCommand = kMIDIMessage_NoteOn << 4 | 0;
result = MusicDeviceMIDIEvent (mySynthUnit, noteCommand, 60, 120, 0);
lastTime = sampleTime/self.graphSampleRate;
}

if (nowTime - lastTime > .5) {
UInt32 noteCommand = kMIDIMessage_NoteOff << 4 | 0;
result = MusicDeviceMIDIEvent (mySynthUnit, noteCommand, 60, 0, 0);
}
}

最佳答案

这里的答案是我误解了 inOffsetSampleFrame 的用途,尽管它的命名很恰当。我想我可以用它在未来的某个任意时间安排一个 noteOff 事件,这样我就不必管理 noteOffs,但它的范围只是在当前的示例框架内。好吧。

关于ios - 音频时间戳格式 + 'MusicDeviceMIDIEvent',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553062/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com