Exemple #1
0
    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;
                }
            }
        }
    }
Exemple #2
0
    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();
        }
    }