Beispiel #1
0
        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();
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public MixerMapping(MidiMapping midi, ATEMMapping atem)
 {
     this.midi = midi;
     this.atem = atem;
 }