private void HandleNoteSelectionChanged(object sender, PropertyChangedEventArgs e) { ItemExtender <IScaleNote, bool> source = sender as ItemExtender <IScaleNote, bool>; if (source == null) { return; } // TODO remove this debug code once I get the velocity initialized correctly if (double.IsNaN(Velocity)) { Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => Velocity = 0.8f)); } if (source.Value == true) { _midiLink.InjectNoteOn(source.Item.MidiNoteNumber, (int)(Velocity * 127)); _notes.Where(item => !Equals(sender, item)).Execute(item => item.Value = false); } else { _midiLink.InjectNoteOff(source.Item.MidiNoteNumber, 0); } }
public override DataTemplate SelectTemplate(object item, DependencyObject container) { FrameworkElement fe = container as FrameworkElement; ItemExtender <IScaleNote, bool> extender = item as ItemExtender <IScaleNote, bool>; if (extender == null) { return(null); } else if (extender.Item.Name.StartsWith("C#") || extender.Item.Name.StartsWith("F#")) { return((DataTemplate)fe.FindResource("BlackKeyTemplateC")); } else if (extender.Item.Name.StartsWith("D#") || extender.Item.Name.StartsWith("A#")) { return((DataTemplate)fe.FindResource("BlackKeyTemplateD")); } else if (extender.Item.Name.Contains("#")) { return((DataTemplate)fe.FindResource("BlackKeyTemplateG")); } else { return((DataTemplate)fe.FindResource("WhiteKeyTemplate")); } }
public void HandleNoteOff(int noteNumber, int velocity, MidiChannel channel = MidiChannel.Omni) { ItemExtender <IScaleNote, bool> note = Notes.FirstOrDefault(n => n.Item.MidiNoteNumber == noteNumber); if (note != null && note.Value) { note.Value = false; } }
private void AddNotes(int bottomNoteIndex, int topNoteIndex) { for (int i = bottomNoteIndex; i <= topNoteIndex; i++) { ItemExtender <IScaleNote, bool> item = new ItemExtender <IScaleNote, bool>(Scale.EqualTemperedScale[i], false); item.PropertyChanged += HandleNoteSelectionChanged; _notes.Add(item); } }
public void HandleNoteOn(int noteNumber, int velocity, MidiChannel channel = MidiChannel.Omni) { ItemExtender <IScaleNote, bool> note = Notes.FirstOrDefault(n => n.Item.MidiNoteNumber == noteNumber); if (note != null && !note.Value) { //Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() => Velocity = velocity / 127d)); note.Value = true; } }