コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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;
 }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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);
            }
        }