ComponentResult AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID, NoteInstanceID inNoteInstanceID, UInt32 inOffsetSampleFrame) { #if DEBUG_PRINT printf("AUInstrumentBase::StopNote %d %d\n", inGroupID, inNoteInstanceID); #endif ComponentResult err = noErr; if (InRenderThread ()) { err = RealTimeStopNote( GetElForGroupID(inGroupID), inNoteInstanceID, inOffsetSampleFrame); } else { SynthEvent *event = mEventQueue.WriteItem(); if (!event) return -1; // queue full event->Set( SynthEvent::kEventType_NoteOff, inGroupID, inNoteInstanceID, inOffsetSampleFrame, NULL ); mEventQueue.AdvanceWritePtr(); } return err; }
OSStatus AUInstrumentBase::StopNote( MusicDeviceGroupID inGroupID, NoteInstanceID inNoteInstanceID, UInt32 inOffsetSampleFrame) { #if DEBUG_PRINT printf("AUInstrumentBase::StopNote ch %u, id %u, offset %u\n", (unsigned)inGroupID, (unsigned)inNoteInstanceID, inOffsetSampleFrame); #endif OSStatus err = noErr; if (InRenderThread ()) { err = RealTimeStopNote( inGroupID, inNoteInstanceID, inOffsetSampleFrame); } else { SynthEvent *event = mEventQueue.WriteItem(); if (!event) return -1; // queue full event->Set( SynthEvent::kEventType_NoteOff, inGroupID, inNoteInstanceID, inOffsetSampleFrame, NULL ); mEventQueue.AdvanceWritePtr(); } return err; }
OSStatus AUInstrumentBase::SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 inEventType, UInt32 inOffsetSampleFrame) { if (InRenderThread ()) { SynthGroupElement *group = GetElForGroupID(inGroupID); if (!group) return kAudioUnitErr_InvalidElement; switch (inEventType) { case SynthEvent::kEventType_SustainOn : group->SustainOn(inOffsetSampleFrame); break; case SynthEvent::kEventType_SustainOff : group->SustainOff(inOffsetSampleFrame); break; case SynthEvent::kEventType_SostenutoOn : group->SostenutoOn(inOffsetSampleFrame); break; case SynthEvent::kEventType_SostenutoOff : group->SostenutoOff(inOffsetSampleFrame); break; case SynthEvent::kEventType_AllNotesOff : group->AllNotesOff(inOffsetSampleFrame); mNumActiveNotes = CountActiveNotes(); break; case SynthEvent::kEventType_AllSoundOff : group->AllSoundOff(inOffsetSampleFrame); mNumActiveNotes = CountActiveNotes(); break; case SynthEvent::kEventType_ResetAllControllers : group->ResetAllControllers(inOffsetSampleFrame); break; } } else { SynthEvent *event = mEventQueue.WriteItem(); if (!event) return -1; // queue full event->Set(inEventType, inGroupID, 0, 0, NULL); mEventQueue.AdvanceWritePtr(); } return noErr; }
OSStatus AUInstrumentBase::StartNote( MusicDeviceInstrumentID inInstrument, MusicDeviceGroupID inGroupID, NoteInstanceID * outNoteInstanceID, UInt32 inOffsetSampleFrame, const MusicDeviceNoteParams &inParams) { OSStatus err = noErr; NoteInstanceID noteID; if (outNoteInstanceID) { noteID = NextNoteID(); *outNoteInstanceID = noteID; } else noteID = (UInt32)inParams.mPitch; #if DEBUG_PRINT printf("AUInstrumentBase::StartNote ch %u, key %u, offset %u\n", inGroupID, (unsigned) inParams.mPitch, inOffsetSampleFrame); #endif if (InRenderThread ()) { err = RealTimeStartNote( GetElForGroupID(inGroupID), noteID, inOffsetSampleFrame, inParams); } else { SynthEvent *event = mEventQueue.WriteItem(); if (!event) return -1; // queue full event->Set( SynthEvent::kEventType_NoteOn, inGroupID, noteID, inOffsetSampleFrame, &inParams ); mEventQueue.AdvanceWritePtr(); } return err; }
ComponentResult AUInstrumentBase::StartNote( MusicDeviceInstrumentID inInstrument, MusicDeviceGroupID inGroupID, NoteInstanceID &outNoteInstanceID, UInt32 inOffsetSampleFrame, const MusicDeviceNoteParams &inParams) { #if DEBUG_PRINT printf("AUInstrumentBase::StartNote %d\n", inGroupID); #endif ComponentResult err = noErr; Float32 pitch = inParams.mPitch; outNoteInstanceID = (pitch == floor(pitch)) ? (UInt32)pitch : NextNoteID(); if (InRenderThread ()) { err = RealTimeStartNote( GetElForGroupID(inGroupID), outNoteInstanceID, inOffsetSampleFrame, inParams); } else { SynthEvent *event = mEventQueue.WriteItem(); if (!event) return -1; // queue full event->Set( SynthEvent::kEventType_NoteOn, inGroupID, outNoteInstanceID, inOffsetSampleFrame, &inParams ); mEventQueue.AdvanceWritePtr(); } return err; }
void AUInstrumentBase::PerformEvents(const AudioTimeStamp& inTimeStamp) { #if DEBUG_PRINT_RENDER printf("AUInstrumentBase::PerformEvents\n"); #endif SynthEvent *event; SynthGroupElement *group; while ((event = mEventQueue.ReadItem()) != NULL) { #if DEBUG_PRINT_RENDER printf("event %08X %d\n", event, event->GetEventType()); #endif switch(event->GetEventType()) { case SynthEvent::kEventType_NoteOn : RealTimeStartNote(GetElForGroupID (event->GetGroupID()), event->GetNoteID(), event->GetOffsetSampleFrame(), *event->GetParams()); break; case SynthEvent::kEventType_NoteOff : RealTimeStopNote(GetElForGroupID (event->GetGroupID()), event->GetNoteID(), event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_SustainOn : group = GetElForGroupID (event->GetGroupID()); group->SustainOn(event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_SustainOff : group = GetElForGroupID (event->GetGroupID()); group->SustainOff(event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_SostenutoOn : group = GetElForGroupID (event->GetGroupID()); group->SostenutoOn(event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_SostenutoOff : group = GetElForGroupID (event->GetGroupID()); group->SostenutoOff(event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_AllNotesOff : group = GetElForGroupID (event->GetGroupID()); group->AllNotesOff(event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_AllSoundOff : group = GetElForGroupID (event->GetGroupID()); group->AllSoundOff(event->GetOffsetSampleFrame()); break; case SynthEvent::kEventType_ResetAllControllers : group = GetElForGroupID (event->GetGroupID()); group->ResetAllControllers(event->GetOffsetSampleFrame()); break; } mEventQueue.AdvanceReadPtr(); } }