예제 #1
0
        public void Handle(MidiEvent midiEvent, int trackIndex)
        {
            var channelMessage = midiEvent.MidiMessage as ChannelMessage;

            int keyCode = channelMessage.Data1;

            // Note already exists, setNoteDuration
            if (keyNoteMap.ContainsKey(keyCode) && (channelMessage.Data2 == 0 || channelMessage.Command == ChannelCommand.NoteOff))
            {
                double noteDuration = SetNoteDuration(keyCode, midiEvent, ticksPerBeat, activeTimeSignature);
                if (midiEvent.AbsoluteTicks >= newBar) // New Bar Line
                {
                    activeStaff.AddSymbol(new Barline());
                    newBar += ticksPerBeat * 4 * ((double)activeTimeSignature.Measure / activeTimeSignature.NumberOfBeats);
                }
            }
            // Create new Note
            else if (channelMessage.Command == ChannelCommand.NoteOn && channelMessage.Data2 > 0)
            {
                if (midiEvent.DeltaTicks > 0) // Found a rest -> construct rest symbol
                {
                    StaffSymbol rest = ConstructRest(midiEvent, ticksPerBeat, activeTimeSignature);
                    activeStaff.AddSymbol(rest);           // TODO
                    if (midiEvent.AbsoluteTicks >= newBar) // New Bar Line
                    {
                        activeStaff.AddSymbol(new Barline());
                        newBar += ticksPerBeat * 4 * ((double)activeTimeSignature.Measure / activeTimeSignature.NumberOfBeats);
                    }
                }

                StaffSymbol note = ConstructNote(keyCode, midiEvent);
                if (note != null)
                {
                    activeStaff.AddSymbol(note);
                }
                else
                {
                    Console.WriteLine("Error: Null note");
                }
            }
        }
예제 #2
0
 public Rest() : base()
 {
     StaffLine      = 7;
     RhythmicValue += " rest";
     StaffSymbol    = StaffSymbol.ToLower();
 }