“All composers should be as lazy as possible when writing scores.” — Max Mathews
This is my favorite quote from computer music culture, and is a fundamental design philosophy of mine.
“All composers should be as lazy as possible when writing scores.” — Max Mathews
This is my favorite quote from computer music culture, and is a fundamental design philosophy of mine.
One idea I have for my theoretical computer music language is having scheduling built right into the syntax, with the hopes that it will add the right balance of functionality and clarity.
I like the idea of having a score language separate from the orchestra language, though I’ve learned over the years that this approach acts as a bottle neck. The @ scheduler is a potential solution to bring both together, without losing the purpose of the score.
Instead of going into great detail on how the @ scheduler might work, I’ll just present the following four examples.
Example 1 — Nested Time:
do_something() # Do something at beat 0, (@0 assumed) @2 do_something() # Do something at beat 2 @5: do_something() # Do something at beat 5: 5 + 0, (@0 assumed) @3 do_something() # Do something at beat 8: 5 + 3 @4: # Block starts at beat 9: 5 + 4 do_something() # Do something at beat 9: 5 + 4 + 0, (@0 assumed) @1 do_something() # Do something at beat 10: 5 + 4 + 1
Example 2 — Changing values mid-event:
def foo(): freq = 440 # Initial frequency @1 freq *= 2 # Frequncy doubles at time 1 output Wavetable.osc(1, freq, sine(8192)) # Output signal
Example 3 — Scheduler error:
def foo(): @1 freq = 440 output Wavetable.osc(1, freq, sine(8192)) # Broken, freq doesn't exist
Example 4 — Organized score + generated events:
def hat_eights(): for i in range(0, 8): @(i / 2.0) hat() @0: hat_eights() @0 kick() @1 snare() @2 kick() @3 snare() @4: hat_eights() @0 kick() @1 snare() @2 kick() @2.5 kick() @3 snare()
That last example reminds me of Max Mathews’ Radio Baton Conductor language.