From f3c6c0a2e4fa4faf0731c13734945eddb8cde193 Mon Sep 17 00:00:00 2001 From: Robert Bendun Date: Fri, 20 Jan 2023 02:04:14 +0100 Subject: [PATCH] builtin ctrl: named input ports, choosing from set of parameters --- musique/interpreter/builtin_functions.cc | 43 ++++++++++++++++++++++++ musique/main.cc | 4 --- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/musique/interpreter/builtin_functions.cc b/musique/interpreter/builtin_functions.cc index e88800d..addcf6d 100644 --- a/musique/interpreter/builtin_functions.cc +++ b/musique/interpreter/builtin_functions.cc @@ -1664,6 +1664,48 @@ static Result builtin_port(Interpreter &interpreter, std::vector a unimplemented(); } + +//: Zwróć wybraną wartość z dedykowanego urządzenia. +//: +//: Pierwszy parametr to numer wejścia lub jego nazwa (kolejno: `'knob`, `'knob2`, `'btn1`, `'btn2`, `'btn3`) +//: Kolejne parametry tworzą zbiór z którego równomiernie wejście będzie wybierane na podstawie wartości +static Result builtin_ctrl(Interpreter &interpreter, std::vector args) +{ + if (args.size() == 1) { + error: + return errors::Unsupported_Types_For { + .type = errors::Unsupported_Types_For::Function, + .name = "ctrl", + .possibilities = { + }, + }; + } + + auto input_index = 0; + if (auto a = get_if(args.front())) { + input_index = a->floor().as_int(); + } else if (auto a = get_if(args.front())) { + static std::string_view names[] = { "knob1", "knob2", "btn1", "btn2", "btn3" }; + + if (auto matched = std::find(std::begin(names), std::end(names), *a); matched != std::end(names)) { + input_index = std::distance(std::begin(names), matched); + } else { + goto error; + } + } else { + goto error; + } + + auto const value = interpreter.serialport->get(input_index); + if (args.size() == 1) { + return value; + } + + auto const arguments = Try(flatten(interpreter, std::span(args).subspan(1))); + auto const arguments_index = (Number(arguments.size()) * value).floor().as_int(); + return arguments[std::min(arguments_index, Number::value_type(arguments.size()-1))]; +} + void Interpreter::register_builtin_functions() { auto &global = *Env::global; @@ -1672,6 +1714,7 @@ void Interpreter::register_builtin_functions() global.force_define("call", builtin_call); global.force_define("ceil", builtin_ceil); global.force_define("chord", builtin_chord); + global.force_define("ctrl", builtin_ctrl); global.force_define("digits", builtin_digits); global.force_define("down", builtin_down); global.force_define("duration", builtin_duration); diff --git a/musique/main.cc b/musique/main.cc index b6c4a7b..858a5eb 100644 --- a/musique/main.cc +++ b/musique/main.cc @@ -196,10 +196,6 @@ struct Runner std::cout << std::endl; return {}; }); - - Env::global->force_define("ctrl", +[](Interpreter &interpreter, std::vector args) -> Result { - return interpreter.serialport->get(std::get(args[0].data).as_int()); - }); } Runner(Runner const&) = delete;