Error reporting in builtins producing midi messages
This commit is contained in:
parent
d60e2dfb38
commit
21bf18bbdd
@ -588,6 +588,7 @@ error:
|
|||||||
|
|
||||||
global.force_define("note_on", +[](Interpreter &i, std::vector<Value> args) -> Result<Value> {
|
global.force_define("note_on", +[](Interpreter &i, std::vector<Value> args) -> Result<Value> {
|
||||||
using Channel_Note_Velocity = Shape<Value::Type::Number, Value::Type::Number, Value::Type::Number>;
|
using Channel_Note_Velocity = Shape<Value::Type::Number, Value::Type::Number, Value::Type::Number>;
|
||||||
|
using Channel_Music_Velocity = Shape<Value::Type::Number, Value::Type::Music, Value::Type::Number>;
|
||||||
|
|
||||||
if (Channel_Note_Velocity::typecheck(args)) {
|
if (Channel_Note_Velocity::typecheck(args)) {
|
||||||
auto [chan, note, vel] = Channel_Note_Velocity::move_from(args);
|
auto [chan, note, vel] = Channel_Note_Velocity::move_from(args);
|
||||||
@ -595,25 +596,71 @@ error:
|
|||||||
return Value {};
|
return Value {};
|
||||||
}
|
}
|
||||||
|
|
||||||
unreachable();
|
if (Channel_Music_Velocity::typecheck(args)) {
|
||||||
|
auto [chan, chord, vel] = Channel_Music_Velocity::move_from(args);
|
||||||
|
|
||||||
|
for (auto note : chord.notes) {
|
||||||
|
note = i.context_stack.back().fill(note);
|
||||||
|
i.midi_connection->send_note_on(chan.as_int(), *note.into_midi_note(), vel.as_int());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Error {
|
||||||
|
.details = errors::Unsupported_Types_For {
|
||||||
|
.type = errors::Unsupported_Types_For::Function,
|
||||||
|
.name = "note_on",
|
||||||
|
.possibilities = {
|
||||||
|
"(number, music, number) -> nil"
|
||||||
|
"(number, number, number) -> nil",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.location = {}
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
global.force_define("note_off", +[](Interpreter &i, std::vector<Value> args) -> Result<Value> {
|
global.force_define("note_off", +[](Interpreter &i, std::vector<Value> args) -> Result<Value> {
|
||||||
using Channel_Note_Velocity = Shape<Value::Type::Number, Value::Type::Number, Value::Type::Number>;
|
using Channel_Note = Shape<Value::Type::Number, Value::Type::Number>;
|
||||||
|
using Channel_Music = Shape<Value::Type::Number, Value::Type::Music>;
|
||||||
|
|
||||||
if (Channel_Note_Velocity::typecheck(args)) {
|
if (Channel_Note::typecheck(args)) {
|
||||||
auto [chan, note, vel] = Channel_Note_Velocity::move_from(args);
|
auto [chan, note] = Channel_Note::move_from(args);
|
||||||
i.midi_connection->send_note_off(chan.as_int(), note.as_int(), vel.as_int());
|
i.midi_connection->send_note_off(chan.as_int(), note.as_int(), 127);
|
||||||
return Value {};
|
return Value {};
|
||||||
}
|
}
|
||||||
|
|
||||||
unreachable();
|
if (Channel_Music::typecheck(args)) {
|
||||||
|
auto [chan, chord] = Channel_Music::move_from(args);
|
||||||
|
|
||||||
|
for (auto note : chord.notes) {
|
||||||
|
note = i.context_stack.back().fill(note);
|
||||||
|
i.midi_connection->send_note_off(chan.as_int(), *note.into_midi_note(), 127);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Error {
|
||||||
|
.details = errors::Unsupported_Types_For {
|
||||||
|
.type = errors::Unsupported_Types_For::Function,
|
||||||
|
.name = "note_off",
|
||||||
|
.possibilities = {
|
||||||
|
"(number, music) -> nil"
|
||||||
|
"(number, number) -> nil",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.location = {}
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
global.force_define("incoming", +[](Interpreter &i, std::vector<Value> args) -> Result<Value> {
|
global.force_define("incoming", +[](Interpreter &i, std::vector<Value> args) -> Result<Value> {
|
||||||
assert(args.size() == 2, "Wrong arity of 'incoming' function");
|
if (args.size() != 2 || args[0].type != Value::Type::Symbol || !is_callable(args[1].type)) {
|
||||||
assert(args[0].type == Value::Type::Symbol, "Expected symbol for first argument of 'incoming'");
|
return Error {
|
||||||
assert(is_callable(args[1].type), "Expected function for second argument of 'incoming'");
|
.details = errors::Unsupported_Types_For {
|
||||||
|
.type = errors::Unsupported_Types_For::Function,
|
||||||
|
.name = "incoming",
|
||||||
|
.possibilities = { "(symbol, function) -> nil" }
|
||||||
|
},
|
||||||
|
.location = {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
std::string const& symbol = args[0].s;
|
std::string const& symbol = args[0].s;
|
||||||
|
|
||||||
@ -622,7 +669,7 @@ error:
|
|||||||
} else if (symbol == "note_off" || symbol == "noteoff") {
|
} else if (symbol == "note_off" || symbol == "noteoff") {
|
||||||
i.callbacks->note_off = std::move(args[1]);
|
i.callbacks->note_off = std::move(args[1]);
|
||||||
} else {
|
} else {
|
||||||
assert(false, "symbol not recognized for 'incoming'");
|
|
||||||
}
|
}
|
||||||
return Value{};
|
return Value{};
|
||||||
});
|
});
|
||||||
@ -644,7 +691,17 @@ error:
|
|||||||
return Value{};
|
return Value{};
|
||||||
}
|
}
|
||||||
|
|
||||||
unreachable();
|
return Error {
|
||||||
|
.details = errors::Unsupported_Types_For {
|
||||||
|
.type = errors::Unsupported_Types_For::Function,
|
||||||
|
.name = "note_off",
|
||||||
|
.possibilities = {
|
||||||
|
"(number) -> nil",
|
||||||
|
"(number, number) -> nil",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.location = {}
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
global.force_define("instrument", pgmchange);
|
global.force_define("instrument", pgmchange);
|
||||||
|
Loading…
Reference in New Issue
Block a user