Пример #1
0
    public void HitBall(int ballnum, int strength)
    {
        if (!setup)
        {
            return;
        }
        float noteal = minKey + winding + ballstep * (ballnum - 1);
        int   note   = Mathf.FloorToInt(noteal);

#if UNITY_EDITOR
        //  Debug.LogFormat("Hitting {0} on {1}", note,bank.GetPatch(0, programNum).Name);
#endif
        //  note = 75;

        //Debug.LogFormat("Hitting note: {0} {1} {2},   {3} {4} pn: {5} {6} {7}",note,ballnum,minKey,ballstep,winding, programNum,strength,setup);
        synthesizer.NoteOffAll(false);

        try
        {
            synthesizer.NoteOn(1, note, strength);
        }
        catch
        {
        }
    }
Пример #2
0
            public void FillBuffer(Synthesizer synthesizer)
            {
                if (delay > 0)
                {
                    delay--;
                }

                if (delay == 0)
                {
                    delay = ReadSingleEventGroup();
                    SendEvents(synthesizer);

                    if (delay == -1)
                    {
                        synthesizer.NoteOffAll(true);

                        if (loop)
                        {
                            Reset();
                        }
                    }
                }

                synthesizer.GetNext();
            }
Пример #3
0
        public void Seek(TimeSpan time)
        {
            int targetSampleTime = (int)(synth.SampleRate * time.TotalSeconds);

            if (targetSampleTime > sampleTime)
            {//process forward
                SilentProcess(targetSampleTime - sampleTime);
            }
            else if (targetSampleTime < sampleTime)
            {//we have to restart the midi to make sure we get the right state: instruments, volume, pan, etc
                sampleTime = 0;
                eventIndex = 0;
                synth.NoteOffAll(true);
                synth.ResetPrograms();
                synth.ResetSynthControls();
                SilentProcess(targetSampleTime);
            }
        }
Пример #4
0
        public void Seek(double timePosition)
        {
            // map to speed=1
            timePosition *= PlaybackSpeed;

            // ensure playback range
            if (PlaybackRange != null)
            {
                if (timePosition < _playbackRangeStartTime)
                {
                    timePosition = _playbackRangeStartTime;
                }
                else if (timePosition > _playbackRangeEndTime)
                {
                    timePosition = _playbackRangeEndTime;
                }
            }

            // move back some ticks to ensure the on-time events are played
            timePosition -= 25;
            if (timePosition < 0)
            {
                timePosition = 0;
            }

            if (timePosition > _currentTime)
            {
                SilentProcess(timePosition - _currentTime);
            }
            else if (timePosition < _currentTime)
            {
                //we have to restart the midi to make sure we get the right state: instruments, volume, pan, etc
                _currentTime = 0;
                _eventIndex  = 0;
                _synthesizer.NoteOffAll(true);
                _synthesizer.ResetPrograms();
                _synthesizer.ResetSynthControls();

                SilentProcess(timePosition);
            }
        }
Пример #5
0
        /// <inheritdoc />
        public void Pause()
        {
            if (State == PlayerState.Paused || !IsReadyForPlayback)
            {
                return;
            }

            Logger.Debug("Pausing playback");
            _state = PlayerState.Paused;
            OnPlayerStateChanged(new PlayerStateChangedEventArgs(_state));

            Output.Pause();
            _synthesizer.NoteOffAll(false);
        }
Пример #6
0
 public void Stop()
 {
     if (synth_provider.state != SynthWaveProvider.PlayerState.Stopped)
     {
         lock (synth_provider.lockObj)
         {
             mseq.Stop();
             synth.NoteOffAll(true);
             synth.ResetSynthControls();
             synth.ResetPrograms();
             synth_provider.state = SynthWaveProvider.PlayerState.Stopped;
             synth_provider.Reset();
         }
     }
 }
Пример #7
0
            protected override bool OnGetData(out short[] samples)
            {
                if (reserved != current)
                {
                    synthesizer.NoteOffAll(true);
                    synthesizer.ResetSynthControls();
                    current = reserved;
                }

                var a = 32768 * (6.0F * config.audio_musicvolume / parent.MaxVolume);

                //
                // Due to a design error, this implementation makes the music
                // playback speed a bit slower.
                // The slowdown is around 1 sec per minute, so I hope no one
                // will notice.
                //

                var t = 0;

                for (var i = 0; i < stepCount; i++)
                {
                    current.FillBuffer(synthesizer);
                    var buffer = synthesizer.sampleBuffer;
                    for (var j = 0; j < buffer.Length; j++)
                    {
                        var sample = (int)(a * buffer[j]);
                        if (sample < short.MinValue)
                        {
                            sample = short.MinValue;
                        }
                        else if (sample > short.MaxValue)
                        {
                            sample = short.MaxValue;
                        }
                        batch[t++] = (short)sample;
                    }
                }

                samples = batch;

                return(true);
            }
Пример #8
0
            private void ProcessMidiEvents(Synthesizer synthesizer)
            {
                if (delay > 0)
                {
                    delay--;
                }

                if (delay == 0)
                {
                    delay = ReadSingleEventGroup();
                    SendEvents(synthesizer);

                    if (delay == -1)
                    {
                        synthesizer.NoteOffAll(false);

                        if (loop)
                        {
                            Reset();
                        }
                    }
                }
            }
Пример #9
0
            private void SendEvents(Synthesizer synthesizer)
            {
                for (var i = 0; i < eventCount; i++)
                {
                    var me = events[i];
                    switch (me.Type)
                    {
                    case 0:     // RELEASE NOTE
                        synthesizer.NoteOff(me.Channel, me.Data1);
                        break;

                    case 1:     // PLAY NOTE
                        synthesizer.NoteOn(me.Channel, me.Data1, me.Data2);
                        break;

                    case 2:     // PITCH WHEEL
                        synthesizer.ProcessMidiMessage(me.Channel, 0xE0, me.Data1, me.Data2);
                        break;

                    case 3:     // SYSTEM EVENT
                        switch (me.Data1)
                        {
                        case 11:         // ALL NOTES OFF
                            synthesizer.NoteOffAll(true);
                            break;

                        case 14:         // RESET ALL CONTROLS
                            synthesizer.ResetSynthControls();
                            break;
                        }
                        break;

                    case 4:     // CONTROL CHANGE
                        switch (me.Data1)
                        {
                        case 0:         // PROGRAM CHANGE
                            if (me.Channel == 9)
                            {
                                break;
                            }
                            synthesizer.ProcessMidiMessage(me.Channel, 0xC0, me.Data2, 0);
                            break;

                        case 1:         // BANK SELECTION
                            synthesizer.ProcessMidiMessage(me.Channel, 0xB0, 0x00, me.Data2);
                            break;

                        case 2:         // MODULATION
                            synthesizer.ProcessMidiMessage(me.Channel, 0xB0, 0x01, me.Data2);
                            break;

                        case 3:         // VOLUME
                            synthesizer.ProcessMidiMessage(me.Channel, 0xB0, 0x07, me.Data2);
                            break;

                        case 4:         // PAN
                            synthesizer.ProcessMidiMessage(me.Channel, 0xB0, 0x0A, me.Data2);
                            break;

                        case 5:         // EXPRESSION
                            synthesizer.ProcessMidiMessage(me.Channel, 0xB0, 0x0B, me.Data2);
                            break;

                        case 8:         // PEDAL
                            synthesizer.ProcessMidiMessage(me.Channel, 0xB0, 0x40, me.Data2);
                            break;
                        }
                        break;
                    }
                }
            }
Пример #10
0
 public void AllNotesOff()
 {
     midiStreamSynthesizer.NoteOffAll(true);
 }
Пример #11
0
    // Called when audio filter needs more sound data
    void OnAudioFilterRead(float[] data, int channels)
    {
        // Do nothing if play not enabled
        // This flag is raised/lowered when user starts/stops play
        // Helps avoids thread finding synth in state of shutting down
        if (!playEnabled)
        {
            return;
        }

        if (initialized)
        {
            if (allSoundsOff)
            {
                midiSynthesizer.NoteOffAll(true);
                midiSynthesizer.ResetSynthControls();
                midiSynthesizer.ResetPrograms();

                allSoundsOff = false;
            }

            while (queue.TryDequeue(out midiMessage))
            {
                midiSynthesizer.ProcessMidiMessage(midiMessage.channel, midiMessage.command, midiMessage.data1, midiMessage.data2);
            }
        }

        int count = 0;

        while (count < data.Length)
        {
            if (currentBuffer == null || bufferHead >= currentBuffer.Length)
            {
                midiSynthesizer.GetNext();

                if (sampleRateDivider == 1)
                {
                    currentBuffer = midiSynthesizer.WorkingBuffer;

                    for (int i = 0; i < currentBuffer.Length; i++)
                    {
                        currentBuffer[i] *= gain * 10f;
                    }
                }
                else
                {
                    tempBuffer = midiSynthesizer.WorkingBuffer;

                    currentBuffer = new float[tempBuffer.Length * sampleRateDivider];

                    for (int i = 0; i < tempBuffer.Length; i += channels)
                    {
                        for (int ch = 0; ch < channels; ch++)
                        {
                            for (int d = 0; d < sampleRateDivider; d++)
                            {
                                currentBuffer[i * sampleRateDivider + ch + d] = tempBuffer[i + ch] * gain * 10f;
                            }
                        }
                    }
                }

                bufferHead = 0;
            }

            var length = Mathf.Min(currentBuffer.Length - bufferHead, data.Length - count);
            System.Array.Copy(currentBuffer, bufferHead, data, count, length);
            bufferHead += length;
            count      += length;
        }
    }
Пример #12
0
 public void Stop()
 {
     synthesizer.NoteOffAll(true);
     audioSource.Stop();
     sequencer.Stop();
 }