public void Execute(ref ExecuteContext <Parameters, Providers> context) { if (context.Outputs.Count != 3) { return; } SampleBuffer gatesOutput = context.Outputs.GetSampleBuffer(0); var gatesOutputBuffer = gatesOutput.Buffer; SampleBuffer notesOutput = context.Outputs.GetSampleBuffer(1); var notesOutputBuffer = notesOutput.Buffer; SampleBuffer triggerOutput = context.Outputs.GetSampleBuffer(2); var triggerOutputBuffer = triggerOutput.Buffer; while (true) { ulong data = DequeueIncomingData(); if (data == 0) { break; } MidiJack.MidiMessage message = new MidiJack.MidiMessage(data); ProcessMessage(message); } float sampleDuration = 1.0f / context.SampleRate; int samplesCount = gatesOutput.Samples; for (int s = 0; s < samplesCount; ++s) { for (int c = 0; c < math.min(16, gatesOutput.Channels); ++c) { gatesOutputBuffer[s * gatesOutput.Channels + c] = _Gates[c] ? 1.0f : 0.0f; } for (int c = 0; c < math.min(16, notesOutput.Channels); ++c) { notesOutputBuffer[s * notesOutput.Channels + c] = (_Notes[c] - 60f) / 12f; } for (int c = 0; c < math.min(16, triggerOutput.Channels); ++c) { unsafe { PulseGenerator *retrigger = (PulseGenerator *)((byte *)_Retrigger.GetUnsafePtr() + UnsafeUtility.SizeOf <PulseGenerator>() * c); triggerOutputBuffer[s * triggerOutput.Channels + c] = retrigger->Process(sampleDuration) ? 1.0f : 0.0f; } } } }
void PressNote(byte note, int channel) { int index = -1; for (int i = 0; i < _HeldNotesCount; ++i) { if (_HeldNotes[i] == note) { index = i; break; } } if (index >= 0) { if (_HeldNotesCount == 1) { _HeldNotesCount = 0; } else { --_HeldNotesCount; _HeldNotes[index] = _HeldNotes[_HeldNotesCount]; } } //Debug.Log("pressing note " + note + " at channel " + channel); _HeldNotes[_HeldNotesCount] = note; ++_HeldNotesCount; _Notes[channel] = note; _Gates[channel] = true; unsafe { PulseGenerator *retrigger = (PulseGenerator *)((byte *)_Retrigger.GetUnsafePtr() + UnsafeUtility.SizeOf <PulseGenerator>() * channel); retrigger->Trigger(); } }