# CHANGELOG
## v0.3.1 (2023-06-03)
New features and new API:
- Added Alda::NREPLServerError#status.
- Added Alda::env.
- Alda::down? and Alda::up? is now useful in \Alda 2.
- Added Alda::REPL#reline.
BREAKING changes of API:
- Now `status` should be specified as a parameter of Alda::NREPLServerError::new.
Fixed bugs:
- Fixed: `alda-irb` does not run correctly in Ruby 3.
- Fixed: cannot handle unknown-op error of nREPL server.
- Fixed: an excess message printed when exiting \REPL on Windows.
Other changes:
- Fixed dependencies.
- Fixed some changelog of 0.3.0.
- Added a gem badge in README.
- Updated bundler version.
## v0.3.0 (2023-05-29)
### Changes for \Alda 2
Added API for support \Alda 2 while still being able to support \Alda 1:
- Added Alda::COMMANDS_FOR_VERSIONS and Alda::GENERATIONS.
- Added Alda::generation, which can be `:v1` or `:v2`.
Specifically, one of the values in the array Alda::GENERATIONS.
- Added Alda::v1?, Alda::v2?, Alda::v1!, Alda::v2! (See Alda::GENERATIONS).
- Added Alda::deduce_generation.
- Added Alda::GenerationError.
- In Alda::Chord#to_alda_code, considering an undocumented breaking change about chords,
the behavior is slightly different for \Alda 1 and \Alda 2.
- Added Thread#inside_alda_list.
- Added Alda::REPL#message and Alda::REPL#raw_message.
APIs that are modified to support \Alda 2:
- (BREAKING CHANGE!) Changed Alda::COMMANDS from an array of symbols into a hash.
The keys are the names of the commands,
and the values are arrays of generations where the command is available.
- Because \Alda 2 does not have the notion of down and up, if we are in v2,
Alda::down? will always return false and Alda::up? will always return true.
- Array#to_alda_code and Hash#to_alda_code behaves differently for \Alda 1 and \Alda 2 regarding
[a breaking change](https://github.com/alda-lang/alda/blob/master/doc/alda-2-migration-guide.md#attribute-syntax-has-changed-in-some-cases).
Documents that modified for notice about \Alda 2:
- Alda::[], Alda::up?, Alda::down?, Alda::COMMANDS.
- Alda::EventList#method_missing.
- Alda::InlineLisp.
- Array#to_alda_code, Hash#to_alda_code.
- Alda::REPL.
- Alda::CommandLineError#port.
Examples that are modified to work in \Alda 2:
- clapping_music,
- dot_accessor,
- marriage_d_amour.
### New things
New features:
- Added warnings about structures that probably trigger errors in \Alda.
See Alda::EventContainer#check_in_chord, Alda::EventList#method_missing.
- Now you can specify a parameter in Alda::Event#detach_from_parent to exclude some
classes of parents that will be detached from.
- (Potentially BREAKING) Alda::Event#detach_from_parent now tries to detach the topmost container
instead of the event itself from the parent.
- Added a commandline program called `alda-irb`. See Alda::REPL.
- Traceback of exception will also be printed now if an Interrupt is caught in \REPL.
- Ctrl+C can now be used to discard the current input in \REPL.
- Now, Alda::REPL takes better care of indents.
- Added no-color mode and no-preview mode for \REPL.
- Now Alda::REPL::TempScore#score and Alda::REPL::TempScore#map output in blue color.
New APIs:
- Added Alda::Raw.
- Added Alda::Utils::warn, Alda::Utils::win_platform?,
Alda::Utils::snake_to_slug, Alda::Utils::slug_to_snake.
- Added Alda::Event#is_event_of?. It is overridden in Alda::EventContainer#is_event_of?.
- Added Alda::Event#== and Alda::EventList#==. It is overridden in many subclasses.
- Added Alda::EventContainer#check_in_chord.
- Added Alda::EventList#l.
- Added Alda::EventList#raw.
- Added Alda::REPL#color, Alda::REPL#preview.
- Added Alda::REPL#setup_repl, Alda::REPL#readline.
- Added Alda::REPL::TempScore#new_score, Alda::REPL::TempScore#score_text,
Alda::REPL::TempScore#score_data, Alda::REPL::TempScore#score_events.
- Added Alda::pipe.
- Added Alda::processes.
- Added Alda::NREPLServerError.
- Added Alda::GenerationError::assert_generation.
Slightly improved docs:
- Alda::EventContainer#event.
- The overriding `to_alda_code`'s and `on_contained`'s.
- Alda::Sequence, Alda::Sequence::RefineFlatten#flatten.
- The patches to Ruby's core classes.
- Kernel.
- Alda::EventList::new.
- Alda::OrderError::new.
- Alda::InlineLisp.
- Alda::OrderError#expected.
Much better docs:
- Alda::EventContainer#/.
- Alda::EventList#on_contained.
- Alda::REPL::TempScore.
New examples:
- dynamics,
- track-volume,
- variables-2.
### BREAKING changes
Removed APIs:
- Removed Alda::SetVariable#original_events.
- Removed Alda::repl. Now calling `Alda.repl` will trigger commandline `alda repl`.
For the old REPL function, use `Alda::REPL.new.run` instead.
- Removed Alda::REPL::TempScore#history.
Modified APIs or features:
- Now Alda::REPL#play_score does not call Alda::REPL#try_command.
- Alda::Score#load now use Alda::Raw instead of an Alda::InlineLisp to load a file.
### Fixed bugs
- Fixed: sometimes Alda::Event#parent returns wrong result
because it is not updated in some cases.
- Fixed (potentially BREAKING): Hash#to_alda_code returns `[[k1 v1] [k2 v2]]`.
Now, it returns `{k1 v1 k2 v2}`.
- Use reline instead of readline in Alda::REPL
because Ruby 3.3 is dropping the shipment of readline-ext.
### Others
- Added changelog.
- Modified the homepage and changelog URI in gemspec.
- Fixed the email in code of conduct.
## v0.2.1 (2020-08-13)
- Fixed the bug in `examples/bwv846_prelude.rb`.
The file isn't changed when the version change
from [v0.1.4](#v014-2020-04-23) to [v0.2.0](#v020-2020-05-08)
but the new features in 0.2.0 made some codes in that file stop working.
## v0.2.0 (2020-05-08)
- Separated `alda-rb.rb` into several files.
- REPL now supports `map`, `score`, and `new`.
- Added a lot of docs. Can be seen [here](https://ulysseszh.github.io/doc/alda-rb).
- Added Alda::Event#detach_from_parent.
- Fixed the bug that dot accessor of Alda::Part does not return the container (or the part itself).
- Added Alda::LispIdentifier.
- Fixed Alda::EventList#import now returns `nil`.
- Added some unit tests.
- Fixed the bug that creating an Alda::GetVariable occasionally crashes.
- Fixed bug that inline lisp is mistakenly interpreted as set-variable.
## v0.1.4 (2020-04-23)
- The Ruby requirements become `">= 2.7"`, so update your Ruby.
- Added a colorful REPL! Run Alda::repl and see.
```
$ ruby -ralda-rb -e "Alda.repl"
> puts status
[27713] Server up (2/2 workers available, backend port: 33245)
> piano_ c d e f
[piano: c d e f]
> 5.times do
> c
> end
c c c c c
> puts history
[piano: c d e f]
c c c c c
> play
> save 'temp.alda'
> puts `cat temp.alda`
[piano: c d e f]
c c c c c
> system 'rm temp.alda'
> exit
```
- More than 2 events written together will become an Alda::Sequence object
(contained by an Alda::EventContainer).
Events that can use such sugar includes:
part (supports dot accessor), note, rest, octave, voice, marker, at-marker.
```ruby
Alda::Score.new { p((c d e).event.class) } # => Alda::Sequence
```
- Added: `o!` means octave up, `o?` means octave down. This is to be compatible with the sugar above.
- Similarly added: `!` at the end of a note means sharp, and `?` for flat, `_` for natural. It conflicts with slur, so `__` means slur, and `___` means slur and natural.
```ruby
Alda::Score.new { piano_ c o? b? o! c o? b? }.to_s
# => "[piano: c < b- > c < b-]"
```
- Added attr accessor Alda::Event#container.
- Fixed the bug occurring when one uses a dot accessor wrongly.
- Added Alda::Sequence::join to join several events into a flatten sequence.
- Fixed the bug in `examples/alternate_endings.rb`.
- Some of the examples are rewritten using the new sugar feature.
- Assign an alda variable by using a method ending with 2 underlines, or pass a block for it. The following three are equivalent:
```ruby
Alda::Score.new { var__ c d e; piano_ var }
```
```ruby
Alda::Score.new { var { c d e }; piano_ var }
```
```ruby
Alda::Score.new { var__ { c d e }; piano_ var }
```
This one is slightly different but has the same effect:
```ruby
Alda::Score.new { var__ c, d, e; piano_ var }
```
The name of a variable can be same as that of a lisp function if there is no ambiguity.
- The message of Alda::CommandLineError is optimized.
- Added Alda::OrderError, which is used instead of RuntimeError, representing a disorder of events.
```ruby
Alda::Score.new do
motif = f4 f e e d d c2
g4 f e d c2
p @events.size # => 2
c4 c g g a a g2 motif
rescue OrderError => e
p @events.size # => 1
p e.expected # => #
p e.got # => #
end
```
- The block passed to an Alda::EventList object is now called in Alda::Event#on_contained, so `@parent`, `@container` etc can be gotten inside.
- Alda::EventList can access methods in `@parent`.
- Canceled Alda::method_missing. Use meta-programming to define methods instead. You can now use `include Alda` to import such commands.
```ruby
include Alda
version # => "Client version: 1.4.1\nServer version: [27713] 1.4.1\n"
```
- Added Kernel#alda. It runs `alda` at command line and does not capture the output.
```ruby
alda 'version'
```
- Use Alda::[] to specify command options (not subcommand options):
```ruby
Alda[quiet: true].play code: 'piano: c d e f' # => ""
```
The options specified will be remembered. Invoke `Alda::clear_options` to forget them.
- Added Alda::CommandLineError#port.
```ruby
begin
Alda[port: 1108].play code: 'y'
rescue CommandLineError => e
e.port # => 1108
end
```
- Added Alda::Score#save and Alda::Score#load to save and load \Alda files.
```ruby
Alda::Score.new { c d e }.save 'temp.alda'
File.read 'temp.alda' # => "[c d e]\n"
```
## v0.1.2 (2020-04-16)
- Added examples
- Fixed bug when writing `key_sig b: [:flat]`
- Added sequence sugar(s) and alternative repetition sugar (`%`) (see examples/alternate_endings.rb)
- Write options naturally for alda command line (`Alda.play code: 'piano: c'`)
- Can pass scores to alda command line (`Alda.play code: Alda::Score.new`)
- Added Alda::Score#parse, Alda::Score#export, and Alda::Score#to_s
- Fixed bug when writing `+o/c`
- Added support for dot accessor (see example/dot_accessor.rb)
- Fixed some mistakes in docs and README
## v0.1.0 (2020-04-15)
The original version.