private void SoundBase_SoundPitchUpdated(object sender, SoundUpdatedEventArgs e) { if (!IsHandleCreated || IsDisposed) { return; } SoundBase snd = (SoundBase)sender; if (snd.IsKeyOff) { return; } this.BeginInvoke(new MethodInvoker(() => { if (IsDisposed) { return; } bool fill; if (TargetTimbres != null) { bool found = false; foreach (var tt in TargetTimbres) { if (snd.Timbre == tt) { found = true; break; } } if (!found) { return; } } if (!receiveChs[snd.NoteOnEvent.Channel]) { return; } int nn = (int)Math.Round(e.NoteNumber + e.Pitch); if (!soundKeyOn.ContainsKey(snd)) { soundKeyOn.Add(snd, new SoundUpdatedEventArgs(nn, e.Velocity, 0)); } else { Invalidate(new Region(getKeyPath(soundKeyOn[snd].NoteNumber, out fill))); soundKeyOn[snd] = new SoundUpdatedEventArgs(nn, e.Velocity, 0); } Invalidate(new Region(getKeyPath(soundKeyOn[snd].NoteNumber, out fill))); })); }
private void SoundBase_SoundKeyOff(object sender, SoundUpdatedEventArgs e) { if (!IsHandleCreated || IsDisposed) { return; } this.BeginInvoke(new MethodInvoker(() => { if (IsDisposed) { return; } bool fill; SoundBase snd = (SoundBase)sender; if (soundKeyOn.ContainsKey(snd)) { Invalidate(new Region(getKeyPath(soundKeyOn[snd].NoteNumber, out fill))); soundKeyOn.Remove(snd); } })); }