Пример #1
0
        public void Write_DeleteDefaultSetTempo()
        {
            var nonDefaultSetTempoEvent = new SetTempoEvent(100000);

            var midiFile = new MidiFile(
                new TrackChunk(
                    new NoteOnEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new NoteOffEvent((SevenBitNumber)100, (SevenBitNumber)50),
                    new UnknownMetaEvent(254),
                    new SetTempoEvent(),
                    nonDefaultSetTempoEvent));

            Write(
                midiFile,
                settings => settings.DeleteDefaultSetTempo = true,
                (fileInfo1, fileInfo2) =>
            {
                var originalMidiFile = MidiFile.Read(fileInfo1.FullName);
                Assert.AreEqual(
                    2,
                    originalMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <SetTempoEvent>().Count(),
                    "Invalid count of Set Tempo events in original file.");

                var newMidiFile    = MidiFile.Read(fileInfo2.FullName);
                var setTempoEvents = newMidiFile.GetTrackChunks().SelectMany(c => c.Events).OfType <SetTempoEvent>().ToArray();
                Assert.AreEqual(
                    1,
                    setTempoEvents.Length,
                    "Invalid count of Set Tempo events in new file.");

                MidiAsserts.AreEventsEqual(setTempoEvents[0], nonDefaultSetTempoEvent, false, "Invalid Set Tempo event.");
            });
        }
Пример #2
0
        public List <MidiEvent> PopEvents(SetTempoEvent lastTempoEvent)
        {
            var res      = new List <MidiEvent>();
            var nextTime = Time + SecondsPerPop;

            bool add = true;

            while (eventIndex + 1 < events.Count && add)
            {
                add = false;
                var e          = events[eventIndex + 1];
                var sampleTime = lastSampleTime + Helpers.TimeConverter.CalculateDeltaSeconds(e, lastTempoEvent.MicrosecondsPerQuarterNote, TimeDivision.TicksPerQuarterNote);
                if (sampleTime <= nextTime)
                {
                    add = true;
                    res.Add(e);
                    eventIndex++;
                    lastSampleTime = sampleTime;
                }
            }

            if (eventIndex + 1 >= events.Count)
            {
                IsFinished = true;
            }

            Time = nextTime;

            return(res);
        }
Пример #3
0
 // Token: 0x06002A63 RID: 10851 RVA: 0x001380BC File Offset: 0x001362BC
 private static void smethod_5(EventsCollection eventsCollection_0, Song gclass27_0)
 {
     if (!GClass30.bool_0)
     {
         foreach (MidiEvent midiEvent in eventsCollection_0)
         {
             TimeSignatureEvent timeSignatureEvent = midiEvent as TimeSignatureEvent;
             if (timeSignatureEvent != null)
             {
                 long absoluteTime = midiEvent.AbsoluteTime;
                 gclass27_0.method_39(new GClass25((uint)absoluteTime, (uint)timeSignatureEvent.Numerator, (uint)timeSignatureEvent.Denominator), false);
             }
             else
             {
                 SetTempoEvent setTempoEvent = midiEvent as SetTempoEvent;
                 if (setTempoEvent != null)
                 {
                     long absoluteTime2 = midiEvent.AbsoluteTime;
                     gclass27_0.method_39(new GClass24((uint)absoluteTime2, (uint)(60000000.0 / (double)setTempoEvent.MicrosecondsPerQuarterNote * 1000.0)), false);
                 }
                 else
                 {
                     TextEvent textEvent = midiEvent as TextEvent;
                     if (textEvent != null)
                     {
                         gclass27_0.string_0 = textEvent.Text;
                     }
                 }
             }
         }
         gclass27_0.method_15();
     }
 }
Пример #4
0
        public void AddTempo(uint tempo)
        {
            var n = new SetTempoEvent(tempo);
            var e = new EventData();

            e.EventType = EventTypeList.Tempo;

            e.Event     = n;
            e.DeltaTime = 0;
            Events.Add(e);
        }
Пример #5
0
 private static TrackChunk AddSetTempoEvents(TrackChunk chunkito, List <TempoChange> tc)
 {
     foreach (var t in tc)
     {
         var setTempoEvent = new SetTempoEvent()
         {
             DeltaTime = t.TicksSinceBeginningOfSong,
             MicrosecondsPerQuarterNote = t.MicrosecondsPerQuarterNote
         };
         chunkito.Events.Add(setTempoEvent);
     }
     return(chunkito);
 }
Пример #6
0
 public void PreProcessTempoMap()
 {
     foreach (var trackChunk in trunks)
     {
         using (var eventsManager = trackChunk.Events.ManageTimedEvents())
         {
             foreach (var tmpChange in Tmap.Tempo)
             {
                 var ev = new SetTempoEvent(tmpChange.Value.MicrosecondsPerQuarterNote);
                 eventsManager.Events.AddEvent(ev, tmpChange.Time);
             }
         }
     }
 }
Пример #7
0
        public void NextSample()
        {
            var lastTempo = tempos[tempoIndex];
            var nextTime  = Time + SecondsPerPop;

            while (tempoIndex + 1 < tempos.Count)
            {
                var tempo     = tempos[tempoIndex + 1];
                var tempoTime = Helpers.TimeConverter.CalculateDeltaSeconds(tempo, lastTempo.MicrosecondsPerQuarterNote, TimeDivision.TicksPerQuarterNote);
                if (tempoTime <= nextTime)
                {
                    lastTempo    = tempo;
                    CurrentTempo = tempo;
                    tempoIndex++;
                }
                else
                {
                    break;
                }
            }

            Time = nextTime;
        }
Пример #8
0
        public void Extractor()
        {
            int  pan         = 0;
            int  noteLength  = 0;
            int  restLength  = 0;
            int  tempLength  = 0;
            int  totalLength = 0;  //the sum of noteLength and restLength.
            int  trackVolume = 1;  //volume of the MIDI track, can change throughout the track
            int  velocity    = 0;  // velocity of the MIDI note
            int  note        = -1; //stores the value of the next note; -1 is the starting note and is a "rest" that might print only in the beginning;
            bool flagNote    = false;

            int[] MIDILength = new int[] { 0, 0, 0, 0 };

            //checks if the out.asm file already exists and clears its contents
            if (File.Exists(string.Concat(directoryPath, ASMFileName, ".asm")))
            {
                FileStream fileStream = File.Open(string.Concat(directoryPath, ASMFileName, ".asm"), FileMode.Open);
                fileStream.SetLength(0);
                fileStream.Close();
            }

            var midifile     = MidiFile.Read(directoryPath + midiFileName + "." + midiFileExtension);
            var trackChuncks = midifile.GetTrackChunks(); // contains the information for all tracks

            if (TempoTrack)
            {
                NumberOfTracks = trackChuncks.Count() - 1;
                TrackNumber    = -1;
            }
            else
            {
                NumberOfTracks = trackChuncks.Count();
            }

            //finds the TimeDivision and the number of tracks of the MIDI file
            string[] tempDivision = midifile.TimeDivision.ToString().Split(' ');
            TimeDivision = Int32.Parse(tempDivision[0]);
            for (int k = 0; k < allowedNotetypes.Length; k++)
            {
                unitaryLengthArray[k] = Convert.ToInt32((double)TimeDivision / (48 / allowedNotetypes[k]));
            }
            unitaryLength = unitaryLengthArray[BaseNotetypeLocation];

            AllTrackList = new List <MIDINote> [NumberOfTracks]; //creates the AllTrackList with NumberOfTracks Length
            // Reads each track in sequence
            foreach (var track in trackChuncks)
            {
                TrackNumber++;
                trackVolume = 1; //resets trackvolume for the new track

                //loops through events
                foreach (MidiEvent Level2 in track.Events)
                {
                    //get the Delta Time of the event
                    tempLength  = (int)Level2.DeltaTime;
                    totalLength = noteLength + tempLength + restLength;

                    switch (Level2.EventType.ToString())
                    {
                    case "ControlChange":
                    {
                        ControlChangeEvent TempEvent = (ControlChangeEvent)Level2;
                        //tests and changes stereopanning
                        if (TempEvent.ControlNumber == 10)
                        {
                            pan = TempEvent.ControlValue;
                        }
                        //sets new trackvolume to define the intensity of this track. Can vary multiple times during the same music.
                        if (TempEvent.ControlNumber == 7)
                        {
                            trackVolume = TempEvent.ControlValue;
                        }
                        break;
                    }

                    //only relevant for the first track
                    case "TimeSignature":
                    {
                        TimeSignatureEvent TempEvent = (TimeSignatureEvent)Level2;
                        timeSignature = TempEvent.Numerator * 16 / TempEvent.Denominator;
                        break;
                    }

                    case "SetTempo":
                    {
                        SetTempoEvent TempEvent = (SetTempoEvent)Level2;
                        Tempo = Convert.ToInt32(TempEvent.MicrosecondsPerQuarterNote) / 3138;;
                        break;
                    }

                    case "NoteOn":
                    {
                        //register the currently "saved" note
                        // we are on a rest

                        NoteEvent TempEvent = (NoteEvent)Level2;
                        flagNote    = true;
                        restLength += tempLength;
                        if ((restLength >= unitaryLength & TrackNumber != 4) || (restLength >= unitaryLength * 16))         //the noise channel only prints rests if its bigger than 16 times the UL
                        {
                            if (IgnoreRests)
                            {
                                NoteListTemp.Add(new MIDINote(noteLength + restLength, MIDILength[TrackNumber - 1], note, pan, velocity, trackVolume));
                            }
                            else
                            {
                                NoteListTemp.Add(new MIDINote(noteLength, MIDILength[TrackNumber - 1], note, pan, velocity, trackVolume));
                                NoteListTemp.Add(new MIDINote(restLength, MIDILength[TrackNumber - 1] + noteLength, 0, pan, velocity, trackVolume));
                            }
                        }
                        else
                        {
                            NoteListTemp.Add(new MIDINote(totalLength, MIDILength[TrackNumber - 1], note, pan, velocity, trackVolume));
                        }

                        //i++; //debug
                        //NoteListTemp.ElementAt(i-1).ShowNotes(); //debug

                        MIDILength[TrackNumber - 1] += totalLength;
                        noteLength = restLength = tempLength = totalLength = 0;

                        //setup for the next note
                        note     = TempEvent.NoteNumber;
                        velocity = TempEvent.Velocity;
                        break;
                    }

                    case "NoteOff":
                    {
                        //NoteEvent TempEvent = (NoteEvent)Level2;
                        flagNote    = true;
                        noteLength += tempLength;
                        break;
                    }

                    default:
                    {
                        break;
                    }
                    }
                    if (!flagNote & tempLength > unitaryLength)
                    {
                        restLength += tempLength;
                    }
                    else if (!flagNote)
                    {
                        noteLength += tempLength;
                    }
                    flagNote = false;
                }

                //last note print
                if (TrackNumber > 0)
                {
                    NoteListTemp.Add(new MIDINote(totalLength, MIDILength[TrackNumber - 1], note, pan, velocity, trackVolume));
                }

                //We've reached the end of the track
                noteLength = restLength = totalLength = 0;
                note       = -1;

                if (TrackNumber > 0)
                {
                    AllTrackList[TrackNumber - 1] = new List <MIDINote>(NoteListTemp);
                    //for(int i=0;i<NoteListTemp.Count;i++)
                    //{
                    //    Console.WriteLine(NoteListTemp.ElementAt(i));
                    //}
                    NoteListTemp.Clear();
                }
            }
        }
Пример #9
0
        private static Tuple <Option <MidiEvent>, int, byte> NextEvent(List <byte> trackData, int startIndex, byte lastMidiChannel)
        {
            var i = startIndex - 1;

            MidiEvent midiEvent = null;

            {
                int deltaTime;
                {
                    var lengthTemp = new List <byte>();
                    do
                    {
                        i += 1;
                        lengthTemp.Add(trackData.ElementAt(i));
                    } while (trackData.ElementAt(i) > 0x7F);

                    deltaTime = VariableLengthUtil.decode_to_int(lengthTemp);
                }

                i += 1;

                var eventTypeValue = trackData.ElementAt(i);

                // MIDI Channel Events
                if ((eventTypeValue & 0xF0) < 0xF0)
                {
                    var midiChannelEventType = (byte)(eventTypeValue & 0xF0);
                    var midiChannel          = (byte)(eventTypeValue & 0x0F);
                    i += 1;
                    var  parameter1 = trackData.ElementAt(i);
                    byte parameter2;

                    // One or two parameter type
                    switch (midiChannelEventType)
                    {
                    // One parameter types
                    case 0xC0:
                        midiEvent       = new ProgramChangeEvent(deltaTime, midiChannel, parameter1);
                        lastMidiChannel = midiChannel;
                        break;

                    case 0xD0:
                        midiEvent       = new ChannelAftertouchEvent(deltaTime, midiChannel, parameter1);
                        lastMidiChannel = midiChannel;
                        break;

                    // Two parameter types
                    case 0x80:
                        i              += 1;
                        parameter2      = trackData.ElementAt(i);
                        midiEvent       = new NoteOffEvent(deltaTime, midiChannel, parameter1, parameter2);
                        lastMidiChannel = midiChannel;
                        break;

                    case 0x90:
                        i              += 1;
                        parameter2      = trackData.ElementAt(i);
                        midiEvent       = new NoteOnEvent(deltaTime, midiChannel, parameter1, parameter2);
                        lastMidiChannel = midiChannel;
                        break;

                    case 0xA0:
                        i              += 1;
                        parameter2      = trackData.ElementAt(i);
                        midiEvent       = new NoteAftertouchEvent(deltaTime, midiChannel, parameter1, parameter2);
                        lastMidiChannel = midiChannel;
                        break;

                    case 0xB0:
                        i              += 1;
                        parameter2      = trackData.ElementAt(i);
                        midiEvent       = new ControllerEvent(deltaTime, midiChannel, parameter1, parameter2);
                        lastMidiChannel = midiChannel;
                        break;

                    case 0xE0:
                        i              += 1;
                        parameter2      = trackData.ElementAt(i);
                        midiEvent       = new PitchBendEvent(deltaTime, midiChannel, parameter1, parameter2);
                        lastMidiChannel = midiChannel;
                        break;

                    // Might be a Control Change Messages LSB
                    default:
                        midiEvent = new ControllerEvent(deltaTime, lastMidiChannel, eventTypeValue, parameter1);
                        break;
                    }

                    i += 1;
                }
                // Meta Events
                else if (eventTypeValue == 0xFF)
                {
                    i += 1;
                    var metaEventType = trackData.ElementAt(i);
                    i += 1;
                    var metaEventLength = trackData.ElementAt(i);
                    i += 1;
                    var metaEventData = Enumerable.Range(i, metaEventLength).Select(trackData.ElementAt).ToArray();

                    switch (metaEventType)
                    {
                    case 0x00:
                        midiEvent = new SequenceNumberEvent(BitConverter.ToUInt16(metaEventData.Reverse().ToArray(), 0));
                        break;

                    case 0x01:
                        midiEvent = new TextEvent(deltaTime, StringEncoder.GetString(metaEventData));
                        break;

                    case 0x02:
                        midiEvent = new CopyrightNoticeEvent(StringEncoder.GetString(metaEventData));
                        break;

                    case 0x03:
                        midiEvent = new SequenceOrTrackNameEvent(StringEncoder.GetString(metaEventData));
                        break;

                    case 0x04:
                        midiEvent = new InstrumentNameEvent(deltaTime, StringEncoder.GetString(metaEventData));
                        break;

                    case 0x05:
                        midiEvent = new LyricsEvent(deltaTime, StringEncoder.GetString(metaEventData));
                        break;

                    case 0x06:
                        midiEvent = new MarkerEvent(deltaTime, StringEncoder.GetString(metaEventData));
                        break;

                    case 0x07:
                        midiEvent = new CuePointEvent(deltaTime, StringEncoder.GetString(metaEventData));
                        break;

                    case 0x20:
                        midiEvent = new MIDIChannelPrefixEvent(deltaTime, metaEventData[0]);
                        break;

                    case 0x2F:
                        midiEvent = new EndOfTrackEvent(deltaTime);
                        break;

                    case 0x51:
                        var tempo =
                            (metaEventData[2] & 0x0F) +
                            ((metaEventData[2] & 0xF0) * 16) +
                            ((metaEventData[1] & 0x0F) * 256) +
                            ((metaEventData[1] & 0xF0) * 4096) +
                            ((metaEventData[0] & 0x0F) * 65536) +
                            ((metaEventData[0] & 0xF0) * 1048576);
                        midiEvent = new SetTempoEvent(deltaTime, tempo);
                        break;

                    case 0x54:
                        midiEvent = new SMPTEOffsetEvent(deltaTime, metaEventData[0], metaEventData[1], metaEventData[2], metaEventData[3], metaEventData[4]);
                        break;

                    case 0x58:
                        midiEvent = new TimeSignatureEvent(deltaTime, metaEventData[0], metaEventData[1], metaEventData[2], metaEventData[3]);
                        break;

                    case 0x59:
                        midiEvent = new KeySignatureEvent(deltaTime, metaEventData[0], metaEventData[1]);
                        break;

                    case 0x7F:
                        midiEvent = new SequencerSpecificEvent(deltaTime, metaEventData);
                        break;
                    }

                    i += metaEventLength;
                }
                // System Exclusive Events
                else if (eventTypeValue == 0xF0 || eventTypeValue == 0xF7)
                {
                    var lengthTemp = new List <byte>();
                    do
                    {
                        i += 1;
                        lengthTemp.Add(trackData.ElementAt(i));
                    } while (trackData.ElementAt(i) > 0x7F);

                    var eventLength = VariableLengthUtil.decode_to_int(lengthTemp);

                    i += 1;

                    var eventData = Enumerable.Range(i, eventLength).Select(trackData.ElementAt);

                    midiEvent = new SysexEvent(deltaTime, eventTypeValue, eventData);

                    i += eventLength;
                }
            }

            return(midiEvent != null
                ? new Tuple <Option <MidiEvent>, int, byte>(new Some <MidiEvent>(midiEvent), i - startIndex, lastMidiChannel)
                : new Tuple <Option <MidiEvent>, int, byte>(new None <MidiEvent>(), i - startIndex, lastMidiChannel));
        }
Пример #10
0
 public void Reset()
 {
     CurrentTempo = tempos[0];
     Time         = 0;
     tempoIndex   = 0;
 }