public EventReadResult Read() { if (Event != null) { Thread.Sleep(2000); } Event = null; switch (state++) { case 6: Exit = true; break; default: var tone = new IonianTone() { Scale = (IonianScale)state, Octave = 4, }; Console.WriteLine($"{(false ? "Release" : "Attack ")} : Scale {tone.Scale}, Octave {tone.Octave}"); Event = new ToneKeyEvent(tone, false); break; } return(EventReadResult.Success); }
public void Release(IonianTone tone) { if (toneMap.TryGetValue(tone, out var index)) { toneMap.Remove(tone); Synthesizer.Release(index); } }
public void Attack(IonianTone tone) { if (toneMap.ContainsKey(tone)) { return; } var freq = Scale.GetFrequency(tone); var index = Synthesizer.Attack(new Oscillator[] { new Oscillator(Wave.CurrentState, freq, OscillatorVolume) }); toneMap[tone] = index; }
void ExecuteOnAttack(PianoKey view) { var tone = new IonianTone() { Scale = view.Scale, Sharp = view.Sharp, Octave = view.Scale == IonianScale.A || view.Scale == IonianScale.B ? Octave + 1 : Octave, }; if (AttackCommand?.CanExecute(tone) ?? false) { AttackCommand.Execute(tone); } }
public async Task Manual([Option("d", "Output device index")] int?device = null, [Option("r", "Sample rate")] int sampleRate = 48000) { var player = new SynthesizerPlayer(); var dev = player.Output.DefaultDevice; if (device != null) { dev = player.Output.Devices[device.Value]; } var input = new ManualEventInput(); var format = new AudioFormat(sampleRate, 1, 32); player.Initialize(dev, format); var source = new CancellationTokenSource(); var runnerTask = player.Run(input, source.Token); var tone = new IonianTone() { Scale = IonianScale.A, Octave = 4, Sharp = false, }; bool exit = false; string line; while (!exit) { Console.Write(" > "); line = Console.ReadLine(); switch (line) { case "": break; case "attack": input.NextEvent = new ToneKeyEvent(tone, false); break; case "release": input.NextEvent = new ToneKeyEvent(tone, true); break; case "filter": input.NextEvent = new ToneFilterEvent(); break; case "wave": input.NextEvent = new ToneWaveEvent(); break; case "1": input.NextEvent = new ToneThumbEvent(ThumbType.CutoffLow, ThumbDirection.CounterClockwise); break; case "2": input.NextEvent = new ToneThumbEvent(ThumbType.CutoffLow, ThumbDirection.Clockwise); break; case "3": input.NextEvent = new ToneThumbEvent(ThumbType.CutoffHigh, ThumbDirection.CounterClockwise); break; case "4": input.NextEvent = new ToneThumbEvent(ThumbType.CutoffHigh, ThumbDirection.Clockwise); break; case "5": input.NextEvent = new ToneThumbEvent(ThumbType.Sustain, ThumbDirection.CounterClockwise); break; case "6": input.NextEvent = new ToneThumbEvent(ThumbType.Sustain, ThumbDirection.Clockwise); break; case "exit": source.Cancel(); await runnerTask; exit = true; break; default: Console.WriteLine($"Unknown command"); break; } } }
public ToneKeyEvent(IonianTone tone, bool release) : base(ToneEventType.Key) { Tone = tone; Release = release; }