Esempio n. 1
0
        public static SynthEvent NewMetronomeEvent(int metronomeLength)
        {
            var x = new SynthEvent(null);

            x.IsMetronome = true;
            return(x);
        }
Esempio n. 2
0
 public void DispatchEvent(int i, SynthEvent synthEvent)
 {
     lock (this)
     {
         _midiEventQueue.AddFirst(synthEvent);
         _midiEventCounts[i]++;
     }
 }
Esempio n. 3
0
        private void LoadMidiFile(MidiFile midiFile)
        {
            _tempoChanges = new FastList<MidiFileSequencerTempoChange>();
            //Converts midi to sample based format for easy sequencing
            float bpm = 120.0f;
            //Combine all tracks into 1 track that is organized from lowest to highest absolute time
            if (midiFile.Tracks.Length > 1 || midiFile.Tracks[0].EndTime == 0)
                midiFile.CombineTracks();

            //Convert delta time to sample time
            _synthData = new SynthEvent[midiFile.Tracks[0].MidiEvents.Length];
            _division = midiFile.Division;
            _eventIndex = 0;
            CurrentTime = 0;
            CurrentTempo = (int)bpm;
            //Calculate sample based time using double counter and round down to nearest integer sample.
            var absDelta = 0.0;
            var absTick = 0;
            var absTime = 0.0;
            for (int x = 0; x < midiFile.Tracks[0].MidiEvents.Length; x++)
            {
                var mEvent = midiFile.Tracks[0].MidiEvents[x];
                _synthData[x] = new SynthEvent(mEvent);
                absTick += mEvent.DeltaTime;
                absTime += mEvent.DeltaTime * (60000.0 / (bpm * midiFile.Division));
                absDelta += Synth.SampleRate * mEvent.DeltaTime * (60.0 / (bpm * midiFile.Division));
                _synthData[x].Delta = (int)(absDelta);
                //Update tempo
                if (IsTempoMessage(mEvent.Command, mEvent.Data1))
                {
                    var meta = (MetaNumberEvent)mEvent;
                    bpm = MidiHelper.MicroSecondsPerMinute / meta.Value;
                    _tempoChanges.Add(new MidiFileSequencerTempoChange(bpm, absTick, (int)(absTime)));
                }
            }

            EndTime = _synthData[_synthData.Length - 1].Delta;
        }