A mirror of SoundHelix, the software MadHelix is based on.

[[ 🗃 ^zoKmE soundhelix ]] :: [📥 Inbox] [📤 Outbox] [🐤 Followers] [🤝 Collaborators] [🛠 Commits]

Clone

HTTPS: git clone https://vervis.peers.community/repos/zoKmE

SSH: git clone USERNAME@vervis.peers.community:zoKmE

Branches

Tags

soundhelix-0.6 :: doc /

CHANGELOG.txt

SoundHelix
----------

Author: Thomas Schürger (thomas@schuerger.com)


Change log
----------


0.6: 2013-04-17

    - Added new experimental greedy constraint mode to the SimpleArrangement engine, which only approximates the ActivityVector
      constraints, but is much faster and can be used for very large numbers of ActivityVectors and very long songs. Added tag
      "constraintMode", which can be set to "exact" for the existing backtracking-based algorithm and to "greedy" for the new
      greedy algorithm. Note that both modes use the "maxIterations" setting, but use the setting differently.

    - Added the new LFO synchronization mode "segmentPair", which synchronizes an LFO to the activity and pause segments of any
      given ActivityVector. The first half of an LFO rotation will be in the active segment, the second half in the pause segment. 

    - The MidiPlayer now supports setting arbitrary MIDI controller values at the beginning of the song, using the "controllerValue"
      tag. This allows, for example, to set relative MIDI volumes, panning, etc., per MIDI channel to fixed values.

    - The track configuration in the SimpleArrangementEngine now supports more than one "sequenceEngine" tag. One of the provided
      SequenceEngines will be taken at random for the track.

    - The MidiPlayer now creates the configured output MIDI file directory if it doesn't exist.

    - Fixed applet to include the SoundHelix XML file URL in Facebook and Twitter URLs.

    - Refactored and cleaned up lots of SoundHelix' internals. This also affects the API of several externally-exposed interfaces.

    - Added new example SoundHelix-Percussion.xml.


0.5: 2012-10-07

    - Added first version of the MIDI file export to the MidiPlayer. Use the tag "midiFilename" to define the MIDI filename template
      for writing MIDI files (one for each MIDI device) between generating and playing a song.

    - Added arbitrary skipping support to the MidiPlayer, including backward skipping. Skipping is now done instantaneously, muting
      the MIDI channels first. Use "skip 0" to replay the current song from the beginning.

    - For the PatternHarmonyEngine the chord crossover pitch can now be defined using the "crossoverPitch" tag. Any chord with
      a root pitch higher than or equal to this pitch will be transposed one octave down, otherwise the root node is taken as-is.
      This is only done if the chord is specified by its name (e.g. "Am6") rather than by providing the pitches in
      "pitch1:pitch2:pitch3" syntax. Previously, the crossover pitch always was between "D" and "D#" (i.e., starting with D#, the
      chords were transposed one octave down, C, C# and D were not transposed). The crossover pitch defaults to this value (3 for
      "D#") for backwards compatibility.

    - Added support for nested pattern expansion where pattern strings are used, using the syntax "(string)*count". For example,
      instead of using "0/2,0/2,0/2,1/2,0/2,0/2,0/2,1/2" in a pattern string you can now use "((0/2)*3,1/2)*2" instead.

    - Added support for "fake" seventh chords, which use 3 instead of 4 notes. Seventh chords can be selected using a simple
      syntax (e.g., "C7" for C major seventh, "Am76" for A minor seventh, second inversion).

    - Added the tags "precondition" and "postcondition" to the "conditionalPattern" tag of the DrumSequenceEngine, which
      replace the "condition" tag and have a much more user-friendly syntax for specifying the condition. For example, instead
      of the old ugly syntax like "0--10>1--10", you can now use something like "-base,+clap,-snare" as the precondition and
      "+base,+clap,-snare" as the postcondition. The "condition" tag is deprecated, but can still be used.

    - Added LinearRandomLFO, which is an LFO that linearly interpolates between a given number of random values.

    - Added usage of GNU Getopt 1.0.14 for cleaner parameter parsing. Run "java -jar SoundHelix.jar -h" to see the details.
      Note that the syntax of the start script parameters (run.bat and run.sh) have been changed as well. Run "run.sh -h"
      or "run.bat -h" to see the details. You can still run the two scripts without parameters to run SoundHelix with the default
      XML file.

    - Added the possibility to list all available MIDI devices with MIDI IN by starting SoundHelix with the "-m" option.

    - Updated included log4j version from 1.2.16 to 1.2.17.

    - Applied a number of refactoring operations (interfaces and implementations have moved into a different package structure,
      some interfaces have been changed).


0.4: 2012-03-13

    - Made the MelodySequenceEngine much more configurable. You can now specify the minimum pitch ("minPitch" tag), the
      maximum pitch ("maxPitch" tag) and the list of pitch distances ("pitchDistances" tag).
    
    - Added support for generating more than one melody per distinct chord section to the MelodySequenceEngine. You can
      now provide a list of integers for the number of melodies to generate per distinct chord section. For each distinct
      chord section a numer is chosen randomly from the list and that number of melodies are generated for the chord section.
      The generated melodies for the distinct chord sections will be used in a round-robin manner each time the respective chord
      section appears.
    
    - Added support for specifying a minimizeChordDistance attribute per chordPattern tag in the PatternHarmonyEngine.
      If set, this attribute allows you to override the global minimizeChordDistance value.

    - Added "retriggerPitches" tag to the PadSequenceEngine. If set to true, all chord pitches will be retriggered on
      every chord change. If set to false, only the chord pitches that have changed are untriggered/triggered, the other ones
      are kept active. Defaults to true, because this was the behavior of version 0.3 and before.

    - Added tags "minAmplitude", "maxAmplitude", "minValue" and "maxValue" to the MidiPlayer's controller LFO configuration.
      "minValue" and "maxValue" lets you set a lower and upper bound, respectively, to the value generated by the LFO. This
      enables the user to shape existing LFO functions by cutting off the LFO function at the specified values. For example, you
      can use a SawtoothLFO to fade out the volume at the end of the song by using an amplitude between 0 and e.g. 5000 and limiting
      the maximum value to 127. Throughout the song the LFO will linearly decline from 5000 to 0 and will give 127 (maximum volume value)
      for every LFO value above 127. This gives you full volume throughout the song, at the end the volume will decrease to 0.
      An example for this is used in "SoundHelix-Piano2.xml". The tags "minimum" and "maximum" have been deprecated (but still work);
      use their equivalent "minAmplitude" and "maxAmplitude" instead.

    - Added more supported MIDI controllers for LFO targets to the MidiPlayer: "volume", "variation", "timbre", "releaseTime",
      "attackTime" and "brightness".
    
    - Changed the LFO implementations to use floating-point instead of fixed-point integer arithmetic. This greatly increases the LFO
      precision.
    
    - Added support for providing the section number to skip to as a floating-point number in the remote control. This allows you to
      skip to any position within a chord section (e.g., you can now use "skip #3.5" to skip into the middle of chord section 3).
      
    - Added support for unreleased versions (e.g., "0.4u", which is considered to be smaller than "0.4", but larger than
      anything starting with "0.3").

    - Fixed bug that treated negative chord offsets incorrectly.

    - Fixed bug in the PatternHarmonyEngine that treated different inversions of the same chord as different when the
      chord pattern was built (relevant for the "x!y" syntax). Now different inversions of the same chord are treated as
      equal.

    - Corrected the MidiPlayer's legato fix from the previous release, which lead to the note being immediately cut off
      if the legato flag was used with the same pitch (e.g., "0~/4,0/4"). This situation is now treated as if the legato
      flag were off.

    - The MIDI channels are now muted if the applet is stopped and the MidiPlayer is used.
    
    - Added another simple example file "SoundHelix-Piano2.xml".


0.3: 2011-10-01

    - Rewrote the internals of the chord functionality and adapted all code accordingly. Now not only major and minor chords
      are supported, but any 3-note chords which use 3 distinct pitches that do not span more than 11 halftones. Extended
      the chord syntax to add inversion support to chords and added diminished and augmented chords ("dim" and "aug",
      respectively, e.g., "Adim4" is a diminished A chord using first inversion, "Caug6" is an augmented C chord using second
      inversion). Arbitrary chords can be provided with the syntax "pitch1:pitch2:pitch3". For example, "-7:-3:3" gives you the
      non-standard chord using the pitches F, A and e.

    - Chord lengths in the PatternHarmonyEngine can now be specified as fractions of beats instead of only whole beats
      (e.g., you can now use "Am/7.5" for a chord that lasts 7.5 beats). Chord lengths are rounded to the nearest integer number
      of ticks.  
      
    - Renamed the tag "obeyChordSubtype" (false/true) to "normalizeChords" (true/false). Normalizing a chord means converting
      chords with first or second inversion (e.g., "Am4" or "Am6") to their normalized counterpart ("Am"), which has the root
      note at its low pitch. Note that only minor, major and diminished chords are normalized if this is on, all other chords
      are unchanged. Note also that "obeyChordSubtype" can still be used, but is deprecated; "normalizeChords" has higher
      priority if both tags are present.
      
    - Added "minimizeChordDistance" tag to the PatternHarmonyEngine. If set to true, all chords will be rotated so that
      their middle pitch is as close as possible to the first chord's middle pitch. This involves changing the inversion
      type of the chords, if needed. Example: if you use "Am/4,C/4", this will effectively be converted to "Am/4,C6/4",
      which leaves the middle pitch at "c" for both chords. Defaults to true, as this was always done in previous
      versions. This can be "undone" by setting "normalizeChords" to "true" in the SequenceEngines where you would like
      to only use the non-inverted versions of the chords.
    
    - Added CrescendoPatternEngine. This lets you generate a pattern from repeated pattern parts while changing the
      velocity so that a crescendo or decrescendo is created. Comes in handy for the DrumSequenceEngine.

    - Improved the DrumSequenceEngine to also check the precondition of conditional patterns for all chord section boundaries
      crossed by the pattern. 

    - Added applet parameters "url" (sets the SoundHelix XML document URL) and "invisible" (hides all controls and
      logging if set to "true", which is nice for embedding the applet into a webpage). Please see the documentation
      about how to use the applet.

    - Added "beforePlayCommands" and "afterPlayCommands" to the MidiPlayer. This allows running external commands before
      playing a song and after playing a song, respectively. For the former, the commands are run before waiting the
      number of ticks configured in beforePlayWaitTicks, for the latter, the commands are run after waiting the number
      of ticks in afterPlayWaitTicks.

    - Added "skip" command to the remote control (usable in the console and the applet), which lets to you skip playing
      to the specified tick, to the specified tick percentage, to the start of the given chord section number or to the
      start of the next chord section during playback (type "help" in the console to see the different syntaxes). Added
      skipping support to the MidiPlayer.

    - The MelodySequenceEngine did not take velocity and legato flag of the provided pattern into account. Fixed.
      
    - Fixed bug in the velocity generation of the RandomPatternEngine if the minimum and maximum pitch is the same.

    - Fixed bug in the MidiPlayer where a NOTE_OFF for a legato pitch was skipped if the same pitch was used as in the
      following note (e.g., "0~/4,0/4").


0.2: 2011-07-31

    - Completely rewrote the constraint fulfillment code in the SimpleArrangementEngine. Now a randomized backtracking
      algorithm is used to find a song activity matrix which fulfills all constraints. The time required to find a valid
      matrix is now a fraction of what it was before, even if more restrictive constraints are used. You might need to
      increase the maxInterations parameter up to a million or more if you used that parameter before (it now defaults to
      1000000).

    - Added "seed" attribute which allows random seeding of a component by providing a constant 64-bit value (decimal
      integer with sign). Added "salt" attribute which allows to set the random salt by providing a 32-bit value (decimal
      integer with sign). Both attributes can be used for all tags where a "class" attribute is used for instantiating a class,
      but not both can be used at the same time. The provided seed value will be used instead of deriving a seed from the
      parent component or as a random seed salt for the seed derivation scheme, respectively. See the "Random seeds" section
      of the documentation for details (http://www.soundhelix.com/doc/random-seeds).

    - Added "obeyChordSections" tag to the ArpeggioSequenceEngine. If set to true, a chord that spans a chord section boundary
      will lead to a pattern being chosen that ends at the boundary rather than when the chord ends. Defaults to false.

    - Added "obeyChordSections" tag to the PadSequenceEngine. If set to true, a chord that spans a chord section boundary
      will lead to retriggering the chord at the boundary. Defaults to false.

    - Added the constraints "minSegmentLength" and "maxSegmentLength" to the SimpleArrangementEntry, which constrain the
      minimum and maximum activity segment lengths, respectively, of an activity vector (counted in chord sections). The two
      constraints will be ignored for an activity vector if the activity vector never becomes active.

    - Added the counterpart constraints "minPauseLength" and "maxPauseLength" to the SimpleArrangementEngine, which constrain
      the minimum and maximum pause lengths, respectively, between activity segments (counted in chord sections).  The
      constraints will be ignored for an activity vector if the activity vector is never active or only has one activity
      segment.

    - Added a "uniquePatternParts" tag to the RandomPatternEngine and the RandomFragmentPatternEngine. If the value is "true",
      the pattern parts within a pattern group a generated until they are unique. If the value is "false", the uniqueness is
      not enforced. Defaults to true (which is what was used in the previous versions).


    - Added "skipWhenApplied" and "skipWhenNotApplied" tags to conditional patterns in the DrumSequenceEngine. With these two
      tags you can define the number of conditional patterns to skip if the current pattern was applied or was not applied
      (even though it was allowed to be applied), respectively. You can skip backwards by using a negative number (-1 would
      repeat the current conditional pattern, -2 would jump to the previous one, etc.; make sure that you don't create
      infinite loops). Both values default to zero, which means that processing continues with the next pattern.

    - Fixed bug that prevented correct random seeding when a song name was used on the command-line.


0.1: 2011-05-22

    - Added a better random seed augmentation scheme. Now random seeds from a component are passed on to subcomponents by
      augmenting the value with a hash value of the implementation class of the subcomponent and the position of the subcomponent
      within the parent component. This makes sure that each subcomponent receives a different random seed with very high
      probability.

    - The DrumSequenceEngine now supports using pitch offsets relative to the base pitch. For example, if the base pitch is
      36, using "0" in the pattern uses pitch 36, "1" uses pitch 37, etc. This is suitable for example for loop players, where
      different pitches for different loop fragments are used.

    - Removed the RhythmSequenceEngine, because it was not configurable and not really usable. Use the DrumSequenceEngine instead.

    - Added a new PatternEngine called RandomFragmentPatternEngine. This PatternEngine can be used for example to generate
      drum patterns. It gives you more control over the results than the RandomPatternEngine by building a pattern by concatenating
      provided pattern fragments, but does not support random velocity generation.

    - Added the constraints startBeforeSection and stopAfterSection to the SimpleArrangementEntry, which are the counterparts of
      startAfterSection and stopBeforeSection, respectively.

    - The RandomSequenceEngine and the RandomPatternSequenceEngine are now deprecated (they will be removed in a future
      version). Consider using the RandomPatternEngine or RandomFragmentPatternEngine with a different SequenceEngine instead.

    - Added pseudo LFO controller "milliBPM" to the MidiPlayer. This allows changing the BPM during playback using an LFO. Note
      that this may have some side-effects on other BPM-dependent parts of the MidiPlayer (MIDI timing ticks, LFOs, etc.), just
      like if you change the BPM manually during playback.

    - Re-implemented the ArpeggioSequenceEngine to use PatternEngines.

    - The SoundHelix applet now sets the applet's window title to the current song name.

    - Improved example. The example now uses the RandomFragmentPatternEngine for the percussion and the ArpeggioSequenceEngine for
      arpeggios.


0.0.5: 2011-02-27

    - The command-line version of SoundHelix now accepts document URLs as well instead of only files, so XML files
      can be referenced by using HTTP/HTTPS/FTP URLs directly. Note that HTTPS requires special JVM configuration.

    - The base URL (xml:base) is now set correctly when XML documents are parsed. This means that
      XInclude can now be used properly. All relative URLs referenced in the XML documents are now
      relative to the including document URLs. The example has been changed to source out the SongNameEngine and
      the HarmonyEngine configuration as separate documents.
 
    - The RandomPatternEngine now also supports wildcards as offsets. Useful for all SequenceEngines which allow wildcards
      (e.g., the MelodySequenceEngine).

    - Introduced "version" attribute for the XML root tag. If present, the application version will be checked against the
      specified version of the tag. If the version attribute ends with a "+" (e.g., "0.0.5+"), the application version must
      be at least the given version, otherwise the versions must match exactly.

    - Added escaping support for splitting strings. For example, now commas in MIDI device names can be escaped by preceding
      them with a backslash.

    - Fixed inconsistent XML structure of the "lfo" tag of the MidiPlayer. The tag is now called "controllerLFO" without
      a "class" attribute, and it has (among others) a subtag called "lfo" with a "class" attribute. Fix your XML files accordingly.

    - Fixed inconsistency in the controllerLFO/channel tag of the MidiPlayer (channels were numbered from 0-15 instead of
      1-16 like in the "map" tag). Fix your XML files accordingly by increasing the LFO channels by 1.

    - Added random seedability and XML configurability to the LFO interface.

    - Added song name text field to the applet. A new song with a given name can be created by entering it into the field,
      with the song name being used as the random seed.

    - Added buttons for Facebook and Twitter to applet, which lets you share the current song easily on Facebook/Twitter.

    - Added buttons for YouTube and SoundHelix to applet, which lets you visit the SoundHelix YouTube channel and the SoundHelix website

    - Added tooltips to all text fields and buttons in the applet.

    - Updated included log4j version from 1.2.8 to 1.2.16.

    - Improved example.


0.0.4: 2011-01-15

    - Added a first version of a JNLP-based applet. The applet is available at
      http://www.soundhelix.com/applet/SoundHelix-applet.jnlp

    - Added support for song name generation. Each XML file now requires a songNameEngine tag.

    - A song can now be recreated by specifying its song name.


0.0.3: 2010-11-11

    - Corrected small problems regarding random initialization.

    - Made run scripts play examples/SoundHelix-Piano.xml if no parameters are given.

    - Updated example.


0.0.2: 2010-11-07

    - Added possibility to specify more than one MIDI device name for the MIDI player; SoundHelix will take the first
      one available on your system.
      
    - Updated example.


0.0.1: 2010-11-02

    - Initial release

[See repo JSON]