Euterpea like duration notation. Cheatsheet

This commit is contained in:
Robert Bendun 2022-05-24 15:34:38 +02:00
parent 6652a08f42
commit fe2cd9f1ef
3 changed files with 104 additions and 1 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ doc/musique
doc/build doc/build
doc/source/api doc/source/api
__pycache__ __pycache__
drafts.cc

79
doc/cheatsheet.txt Normal file
View File

@ -0,0 +1,79 @@
---------------------------------------------------------------------------
Składnia
---------------------------------------------------------------------------
Zapis nut (dostępna notacja zachodnia)
c
d
Arytmetyka
(aktualnie brak wsparcia dla precedensji operatorów)
3 * (4 * 12 - 8)
Wywołanie funkcji
foo 1 2 3
Kilka wywołań obok siebie
foo 1; bar 2
Stworzenie zmiennej
var variable = 20
Blok
Jako tablica
[1;2;3]
Jako odroczona ewaluacja
[say 42]
Jako funkcja anonimowa jednoparametrowa
[i | i * i ]
Poniższe zapisy są równoważne
[ say 42 ]
[| say 42 ]
---------------------------------------------------------------------------
Dostępne stałe
---------------------------------------------------------------------------
fn 1
dfn 3/2
hn 1/2
dhn 3/4
ddhn 7/8
qn 1/4
dqn 3/8
ddqn 7/16
en 1/8
den 3/16
dden 7/32
sn 1/16
dsn 3/32
tn 1/32
dtn 3/64
---------------------------------------------------------------------------
Dostępne funkcje
---------------------------------------------------------------------------
if : condition: bool, block: block -> (eval block)
wywołuje block jeśli condition jest:
dla b: bool jest b == true
dla n: number jest n != 0
dla nil jest false
dla typu music, block, intrinsic, symbol zawsze prawdziwe
if : condition: Bool, then: Block, else: Block -> (eval then or eval else)
jeśli condition jest prawdziwe wg zasad wyżej wywołaj then
w innym przypadku wywołaj else
len : block -> number
zwraca ilość elementów (liczbę indeksowalnych pozycji) wewnątrz bloku
Przykład:
len [1;2;3] == 3
len [foo;bar] == 2
len [foo bar] == 1
play : music... -> nil
odtwarza sekwencyjnie otrzymane wartości muzyczne

View File

@ -53,6 +53,27 @@ constexpr auto comparison_operator()
}; };
} }
/// Registers constants like `fn = full note = 1/1`
static inline void register_note_length_constants()
{
auto &global = *Env::global;
global.force_define("fn", Value::number(Number(1, 1)));
global.force_define("dfn", Value::number(Number(3, 2)));
global.force_define("hn", Value::number(Number(1, 2)));
global.force_define("dhn", Value::number(Number(3, 4)));
global.force_define("ddhn", Value::number(Number(7, 8)));
global.force_define("qn", Value::number(Number(1, 4)));
global.force_define("dqn", Value::number(Number(3, 8)));
global.force_define("ddqn", Value::number(Number(7, 16)));
global.force_define("en", Value::number(Number(1, 8)));
global.force_define("den", Value::number(Number(3, 16)));
global.force_define("dden", Value::number(Number(7, 32)));
global.force_define("sn", Value::number(Number(1, 16)));
global.force_define("dsn", Value::number(Number(3, 32)));
global.force_define("tn", Value::number(Number(1, 32)));
global.force_define("dtn", Value::number(Number(3, 64)));
}
Interpreter::Interpreter() Interpreter::Interpreter()
{ {
{ // Context initialization { // Context initialization
@ -64,6 +85,9 @@ Interpreter::Interpreter()
} }
{ // Global default functions initialization { // Global default functions initialization
auto &global = *Env::global; auto &global = *Env::global;
register_note_length_constants();
global.force_define("typeof", +[](Interpreter&, std::vector<Value> args) -> Result<Value> { global.force_define("typeof", +[](Interpreter&, std::vector<Value> args) -> Result<Value> {
assert(args.size() == 1, "typeof expects only one argument"); assert(args.size() == 1, "typeof expects only one argument");
return Value::symbol(std::string(type_name(args.front().type))); return Value::symbol(std::string(type_name(args.front().type)));
@ -80,7 +104,6 @@ Interpreter::Interpreter()
} }
}); });
global.force_define("len", +[](Interpreter &, std::vector<Value> args) -> Result<Value> { global.force_define("len", +[](Interpreter &, std::vector<Value> args) -> Result<Value> {
assert(args.size() == 1, "len only accepts one argument"); assert(args.size() == 1, "len only accepts one argument");
assert(args.front().type == Value::Type::Block, "Only blocks can be measure"); assert(args.front().type == Value::Type::Block, "Only blocks can be measure");