private static void Main(string[] args) { const string input = @"../../../Test Data/cantus firmus.xml"; const string output = @"../../../Test Data/output.xml"; ScorePartwise.Serialize(output, ScorePartwise.Deserialize(input)); var score = ScorePartwise.Deserialize(input); var list = new List <int>(); foreach (var part in score.Parts) { Console.WriteLine("Part " + part.Id); list.AddRange(from measure in part.Measures from note in measure.Notes.Where(note => note.Staff == "1") select MidiMapping.MidiLookUp(note.Pitch)); } foreach (var i in list) { Console.Write(i + " "); } Console.WriteLine("\r\n\r\npress any key to continue..."); Console.ReadLine(); }
private List <MidiEvent> ParseGuitar6(Xmk xmk, bool guitar = true) { MidiMapping map = _guitarTouchMap; List <MidiEvent> track = new List <MidiEvent>(); track.Add(new NAudio.Midi.TextEvent(guitar ? "PART GUITAR" : "PART BASS", MetaEventType.SequenceTrackName, 0)); foreach (var entry in xmk.Entries) { long start = GetAbsoluteTime(entry.Start * 1000); long end = GetAbsoluteTime(entry.End * 1000); int velocity = 100; // Text event? if (!string.IsNullOrEmpty(entry.Text)) { continue; // Don't write text events } //track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.TextEvent, start)); if ((end - start) <= 0 || entry.Pitch > 127) { continue; } int pitchRemap = map[entry.Pitch]; if (pitchRemap == -1) { continue; } track.Add(new NoteEvent(start, 1, MidiCommandCode.NoteOn, pitchRemap, velocity)); track.Add(new NoteEvent(end, 1, MidiCommandCode.NoteOff, pitchRemap, velocity)); } // Adds play event var firstNote = track.Where(x => x is NoteEvent).Select(y => y as NoteEvent).OrderBy(y => y.AbsoluteTime).FirstOrDefault(); if (firstNote != null) { var idx = track.IndexOf(firstNote); track.Insert(idx, new NAudio.Midi.TextEvent("[play]", MetaEventType.TextEvent, firstNote.AbsoluteTime)); } // Adds idle event (end) var lastNote = track.Where(x => x is NoteEvent).Select(y => y as NoteEvent).OrderByDescending(y => y.AbsoluteTime).FirstOrDefault(); if (lastNote != null) { var idx = track.IndexOf(lastNote); track.Insert(idx, new NAudio.Midi.TextEvent("[idle]", MetaEventType.TextEvent, lastNote.AbsoluteTime)); } // Adds end track track.Add(new MetaEvent(MetaEventType.EndTrack, 0, track.Last().AbsoluteTime)); return(track); }
private List <MidiEvent> ParseEvents(Xmk xmk) { MidiMapping map = _guitarMap; List <MidiEvent> track = new List <MidiEvent>(); track.Add(new NAudio.Midi.TextEvent("EVENTS", MetaEventType.SequenceTrackName, 0)); foreach (var entry in xmk.Entries) { if (string.IsNullOrEmpty(entry.Text) || entry.Unknown3 != 3) { continue; // Practice section } long start = GetAbsoluteTime(entry.Start * 1000); long end = GetAbsoluteTime(entry.End * 1000); string text = GetPracticeName(entry.Text); track.Add(new NAudio.Midi.TextEvent(text, MetaEventType.TextEvent, start)); } // Adds end track track.Add(new MetaEvent(MetaEventType.EndTrack, 0, track.Last().AbsoluteTime)); return(track); }
private List <MidiEvent> ParseGuitar3(Xmk xmk, bool guitar = true) { MidiMapping map = _guitarMap; List <MidiEvent> track = new List <MidiEvent>(); track.Add(new NAudio.Midi.TextEvent(guitar ? "PART GUITAR GHL" : "PART BASS GHL", MetaEventType.SequenceTrackName, 0)); // Tracks HOPO on/off events List <NoteOnEvent> hopoNotes = new List <NoteOnEvent>(); foreach (var entry in xmk.Entries) { long start = GetAbsoluteTime(entry.Start * 1000); long end = GetAbsoluteTime(entry.End * 1000); int velocity = 100; // Text event? if (!string.IsNullOrEmpty(entry.Text)) { continue; // Don't write text events } //track.Add(new NAudio.Midi.TextEvent(entry.Text, MetaEventType.TextEvent, start)); if ((end - start) <= 0 || entry.Pitch > 127) { continue; } if ((entry.Unknown2 & 2) == 2) // Observed 0x02, 0xCA { // Barre chord int shift = (entry.Pitch % 2 == 1) ? 1 : -1; track.Add(new NoteEvent(start, 1, MidiCommandCode.NoteOn, map[entry.Pitch + shift], velocity)); track.Add(new NoteEvent(end, 1, MidiCommandCode.NoteOff, map[entry.Pitch + shift], velocity)); } int pitchRemap = map[entry.Pitch]; if (pitchRemap == -1) { continue; } track.Add(new NoteEvent(start, 1, MidiCommandCode.NoteOn, pitchRemap, velocity)); track.Add(new NoteEvent(end, 1, MidiCommandCode.NoteOff, pitchRemap, velocity)); int hopoPitch; // Sets forced HOPO off pitch if (pitchRemap >= 94 && pitchRemap <= 100) { hopoPitch = 102; // Expert } else if (pitchRemap >= 82 && pitchRemap <= 88) { hopoPitch = 90; // Hard } else if (pitchRemap >= 70 && pitchRemap <= 76) { hopoPitch = 78; // Medium } else if (pitchRemap >= 58 && pitchRemap <= 64) { hopoPitch = 66; // Easy } else { continue; } hopoPitch -= (entry.Unknown3 & 0x80) >> 7; // 1 = Forced HOPO hopoNotes.Add(new NoteOnEvent(start, 1, hopoPitch, velocity, (int)(end - start))); } // Flattens HOPO events var groupedNotes = hopoNotes.GroupBy(x => x.NoteNumber); foreach (var group in groupedNotes) { // Selects longest note at each absolute time offset var notes = group.GroupBy(x => x.AbsoluteTime).Select(y => y.OrderByDescending(z => z.NoteLength).First()).OrderBy(q => q.AbsoluteTime); NoteOnEvent prevNote = notes.First(); track.Add(prevNote); foreach (var note in notes.Skip(1)) { if (note.AbsoluteTime >= prevNote.OffEvent.AbsoluteTime) { track.Add(prevNote.OffEvent); } else { // Overlap detected, insert note off event track.Add(new NoteEvent(note.AbsoluteTime, note.Channel, MidiCommandCode.NoteOff, note.NoteNumber, note.Velocity)); } track.Add(note); prevNote = note; } // Adds last note off event track.Add(prevNote.OffEvent); } // Adds play event var firstNote = track.Where(x => x is NoteEvent).Select(y => y as NoteEvent).OrderBy(y => y.AbsoluteTime).FirstOrDefault(); if (firstNote != null) { var idx = track.IndexOf(firstNote); track.Insert(idx, new NAudio.Midi.TextEvent("[play]", MetaEventType.TextEvent, firstNote.AbsoluteTime)); } // Adds idle event (end) var lastNote = track.Where(x => x is NoteEvent).Select(y => y as NoteEvent).OrderByDescending(y => y.AbsoluteTime).FirstOrDefault(); if (lastNote != null) { var idx = track.IndexOf(lastNote); track.Insert(idx, new NAudio.Midi.TextEvent("[idle]", MetaEventType.TextEvent, lastNote.AbsoluteTime)); } // Sorts by absolute time track.Sort((x, y) => { if (x.AbsoluteTime < y.AbsoluteTime) { return(-1); } else if (x.AbsoluteTime > y.AbsoluteTime) { return(1); } // Same abs time, note off goes first if (x.CommandCode == MidiCommandCode.NoteOff && y.CommandCode == MidiCommandCode.NoteOn) { return(-1); } else if (x.CommandCode == MidiCommandCode.NoteOn && y.CommandCode == MidiCommandCode.NoteOff) { return(1); } else { return(0); } }); // Adds end track track.Add(new MetaEvent(MetaEventType.EndTrack, 0, track.Last().AbsoluteTime)); return(track); }
public MixerMapping(MidiMapping midi, ATEMMapping atem) { this.midi = midi; this.atem = atem; }