예제 #1
0
        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);
        }
예제 #2
0
 public void Release(IonianTone tone)
 {
     if (toneMap.TryGetValue(tone, out var index))
     {
         toneMap.Remove(tone);
         Synthesizer.Release(index);
     }
 }
예제 #3
0
        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;
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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;
                }
            }
        }
예제 #6
0
 public ToneKeyEvent(IonianTone tone, bool release) : base(ToneEventType.Key)
 {
     Tone    = tone;
     Release = release;
 }