- Minor aesthetic fixes to the way errors are reported in the Alda REPL and when using the
alda parse
task.
-
Improved parsing performance, especially noticeable for larger scores. More information here, but the TL;DR version is that we now parse each instrument part individually using separate parsers, and we also make an initial pass of the entire score to strip out comments. This should not be a breaking change; you may notice that it takes less time to parse large scores.
-
As a consequence of the above, there is no longer a single parse tree for an entire score, which means parsing errors are less informative and potentially more difficult to understand. We're viewing this as a worthwhile trade-off for the benefits of improved performance and better flexibility in parsing as Alda's syntax grows more complex.
-
Minor note that will not affect most users:
alda.parser/parse-input
no longer returns an Instaparse failure object when given invalid Alda code, but instead throws an exception with the Instaparse failure output as a message.
-
Custom events can now be scheduled via inline Clojure code.
-
Added
electric-bass
alias formidi-electric-bass-finger
.
-
Note lengths can now be optionally specified in seconds (
c2s
) or milliseconds (c2000ms
). -
Repeats implemented.
- Added
:quit
to the list of commands available when you type:help
.
- There is now a help system in the Alda REPL. Enter
:help
to see all available commands, or:help <command>
for additional information about a command.
- Fix bug re: nested CRAM rhythms. (#124)
- Fix minor bug in Alda REPL where ConsoleReader was trying to expand
!
characters like bash does. (#125)
- CRAM, a fun way to represent advanced rhythms (crisptrutski/daveyarwood)
-
Implemented code block literals, which don't do anything yet, but will pave the way for features like repeats.
-
alda-code
function added to thealda.lisp
namespace, for use in inline Clojure code. This function takes a string of Alda code, parses and evaluates it in the context of the current score. This is useful because it allows you to build up a string of Alda code programmatically via Clojure, then evaluate it as if it were written in the score to begin with! More info on this in the docs.
-
Bugfix (#120), don't allow negative note lengths.
-
Handy
alda script
task allows you to print the latest alda script to STDOUT, so you can pipe it to wherever you keep it on your$PATH
, e.g.alda script > /usr/local/bin/alda
.
- Fix edge case regression caused by the 0.10.2.
- Fix bug in playback
from
/to
options where playback would always start at offset 0, instead of whenever the first note in the playback slice comes in.
- Fix bug where playback hangs if no instruments are defined (#114) May have also caused lock-ups in other situations also.
-
from
andto
arguments allow you to play from/to certain time markings (e.g. 1:02 for 1 minute, 2 seconds in) or markers. This works both from the command-line (alda play --from 0:02 --to myMarker
) and in the Alda REPL (:play from 0:02 to myMarker
). (crisptrutski) -
Simplify inline Clojure expressions -- now they're just like regular Clojure expressions. No monkey business around splitting on commas and semicolons.
-
The
alda
script has changed in order to pave the way for better/simpler inline Clojure code evaluation. This breaks attribute-setting if you're using analda
script from before 0.10.0. You will need to reinstall the latest script to/usr/local/bin
or wherever you keep it on your$PATH
. -
This breaks backwards compatibility with "multiple attribute changes," i.e.:
(volume 50, tempo 100)
This will now attempt to be read as a Clojure expression
(volume 50 tempo 100)
(since commas are whitespace in Clojure), which will fail because thevolume
function expects only one argument.To update your scores that contain this syntax, change the above to:
(do (volume 50) (tempo 100))
or just:
(volume 50) (tempo 100)
- Implemented panning via the
panning
attribute.
-
Added the ability to specify a key signature via the
key-signature
attribute. Accidentals can be left off of notes if they are in the key signature. See the docs for more info on how to use key signatures. (FragLegs/daveyarwood) -
=
after a note is now parsed as a natural, e.g.b=
is a B natural. This can be used to override the key signature, as in traditional music notation.
- Fixed a couple of bugs around inline Clojure code. (crisptrutski)
- Alda now supports inline Clojure code! Anything between parentheses is interpreted as a Clojure expression and evaluated within the context of the
alda.lisp
namespace. To preserve backwards compatibility, attributes still work the same way -- they just happen to be function calls now -- and there is a special reader behavior that will split an S-expression into multiple S-expressions if there is a comma or semicolon, so that there is even backwards compatibility with things like this:(volume 50, tempo! 90)
(under the hood, this is read by the Clojure compiler as(do (volume 50) (tempo! 90))
).
- Alda no longer has a native
(* long comment syntax *)
. This syntax will now be interpreted as a Clojure S-expression, which will fail because it will try to interpret everything inside as Clojure values and multiply them all together :) The "official" way to do long comments in an Alda score now is to via Clojure'scomment
macro, or you can always just use short comments.
- Bugfix: The Alda REPL
:play
command was only resetting the current/last offset of all the instruments for playback, causing inconsistent playback with respect to other things like volume and octave. Now it resets all of the instruments' attributes to their initial values, so it is truly like they are starting over from the beginning of the score.
- Bugfix: parsing no longer fails when following a voice group with an instrument call.
-
Fixed another regression caused by 0.6.1 -- tying notes across barlines was no longer working because the barlines were evaluating to
nil
and throwing a wrench in duration calculation. -
Added a
--tree
flag to thealda parse
task, which prints the intermediate parse tree before being transformed to alda.lisp code.
- Fixed a regression caused by 0.6.1 -- the
barline
function inalda.lisp.events.barline
wasn't actually being loaded intoalda.lisp
. Also, add debug log that this namespace was loaded intoalda.lisp
.
- Bar lines are now parsed as events (events that do nothing when evaluated) instead of comments; this is done in preparation for being able to generate visual scores.
- Alda REPL
:play
command -- plays the current score from the beginning. (crisptrutski/daveyarwood)
- Allow quantization > 100% for overlapping notes. (crisptrutski)
Exit with error code 1 when parsing fails for alda play
and alda parse
tasks. (MadcapJake)
- Bugfix: add any pre-buffer time to the synchronous wait time -- keeps scores from ending prematurely when using the
alda play
task. - Grammar improvement: explicit
octave-set
,octave-up
andoctave-down
tokens instead of one catch-alloctave-change
token. (crisptrutski)
- Pretty-print the results of the
alda parse
task.
- New Alda REPL commands:
:load
loads a score from a file.:map
prints the current score (as a Clojure map of data).:score
prints the current score (Alda code).
- Turn off debug logging by default. WARN is the new default debug level.
- Debug level can be explicitly set via the
TIMBRE_LEVEL
environment variable.
- Bugfix/backwards compatibility: don't use Clojure 1.7
update
command.
- Don't print the score when exiting the REPL (preparing for the
:score
REPL command which will print the score whenever you want.
help
andversion
tasks moved to the top of help text
alda help
command
alda
executable script- version number now stored in
alda.version
- various other improvements/refactorings
- Long comment syntax changed from
#{ this }
to(* this *)
.
alda play
task now reports parse errors.
-
alda.sound/play!
now automatically determines the audio types needed for a score, makingalda.sound/set-up! <type>
optional. -
various internal improvements / refactorings
- Minor bugfix,
track-volume
attribute was not being included in notes due to a typo.
- "Official" first release of Alda. Finally deployed to clojars, after ~3 years of tinkering.