private void PlayToFile(SoundFile soundFile, SoundTarget target) { logger.Info($"Writing playback of [green]{options.InputPath}[/] to [green]{options.OutputPath}[/]..."); try { var transmitter = new MidiFileWriterTransmitter(); using (var engine = new ImuseEngine(transmitter, target, options.ImuseOptions)) { // Clean up, even with Ctrl+C ConsoleHelpers.SetupCancelHandler(engine, transmitter); engine.RegisterSound(0, soundFile); engine.StartSound(0); transmitter.Start(); transmitter.Write(options.OutputPath); ConsoleHelpers.TearDownCancelHandler(); } } catch (ImuseException ex) { throw new ImuseSequencerException(ex.Message, ex); } }
private void BuildCommands(ImuseEngine engine, UIHandler handler) { var interactivityInfo = engine.GetInteractivityInfo(0); int index = 0; foreach (var hook in interactivityInfo.Hooks) { if (hook.Id == 0) { // Hook 0 is unconditional continue; } var c = hookChars[index]; handler.RegisterKeyPress(c.ToString(), $"{hook}", key => { engine.Commands.SetHook(0, hook.Type, hook.Id, hook.Channel); return(true); }); index++; } if (interactivityInfo.SetLoops.Any()) { var c = hookChars[index]; handler.RegisterKeyPress(c.ToString(), "clear-loop", key => { engine.Commands.ClearLoop(0); return(true); }); } handler.RegisterKeyPress("esc", "Quit", key => false); }
public static void SetupCancelHandler(ImuseEngine engine, ITransmitter transmitter) { // Clean up, even with Ctrl+C cancelHandler = new ConsoleCancelEventHandler((sender, e) => { logger.Warning("Abrupt exit - trying to clean up..."); engine.Dispose(); if (transmitter is IDisposable disposableTransmitter) { disposableTransmitter.Dispose(); } }); Console.CancelKeyPress += cancelHandler; }
private void Play(string source) { var uiHandler = new UIHandler(); var fileProvider = new FileProvider(settings.MidiFolder, options.Target); var interpreter = new Interpreter(source, fileProvider); options.DeviceSelector = OutputHelpers.Instance.DetermineDeviceSelector(options.DeviceSelector, options.Target); try { using (var transmitter = OutputHelpers.Instance.CreateTransmitter(options.DeviceSelector, options.Latency)) { using (var engine = new ImuseEngine(transmitter, options.Target, options.ImuseOptions)) { // Clean up, even with Ctrl+C ConsoleHelpers.SetupCancelHandler(engine, transmitter); logger.Info($"Target device: [green]{options.Target.GetDisplayName()}[/]"); logger.Info($"Outputting to: [green]{transmitter.OutputName}[/]"); logger.Info(""); interpreter.Execute(engine); engine.Tick += interpreter.Tick; logger.Info(""); foreach (var evt in engine.Events.KeyPressEvents) { uiHandler.RegisterKeyPress(evt.Key, evt.Action.Name, key => { engine.Events.TriggerKey(key, interpreter.Context); return(true); }); } uiHandler.RegisterKeyPress("esc", "Quit", key => false); uiHandler.OutputMenu(); transmitter.Start(); uiHandler.Run(); ConsoleHelpers.TearDownCancelHandler(); } } } catch (ImuseException ex) { throw new ImuseSequencerException(ex.Message, ex); } }
private void PlayToDevice(SoundFile soundFile, SoundTarget target) { logger.Info($"Playing [green]{options.InputPath}[/]..."); var uiHandler = new UIHandler(); options.DeviceSelector = OutputHelpers.Instance.DetermineDeviceSelector(options.DeviceSelector, target); try { using (var transmitter = OutputHelpers.Instance.CreateTransmitter(options.DeviceSelector, options.Latency)) { using (var engine = new ImuseEngine(transmitter, target, options.ImuseOptions)) { // Clean up, even with Ctrl+C ConsoleHelpers.SetupCancelHandler(engine, transmitter); logger.Info($"Target device: [green]{target.GetDisplayName()}[/]"); logger.Info($"Outputting to: [green]{transmitter.OutputName}[/]"); logger.Info($"iMUSE version: [green]{soundFile.ImuseVersion.GetDisplayName()}[/]"); logger.Info(""); engine.RegisterSound(0, soundFile); engine.StartSound(0); logger.Info(""); BuildCommands(engine, uiHandler); uiHandler.OutputMenu(); transmitter.Start(); uiHandler.Run(); ConsoleHelpers.TearDownCancelHandler(); } } } catch (ImuseException ex) { throw new ImuseSequencerException(ex.Message, ex); } }