JMSL  version changes

JMSL v102

* New transcription package: com.softsynth.jmsl.score.transcribe, enables common music notation of arbitrarily timed events.  See JMSLTestSuite.TestTranscribe

* MusicXML export from JMSL Score (import Scores into Finale with Dolet plugin, for example, and other software supporting MusicXML import; see www.recordare.com)

* Now supports SysEx send and receive with Grame's MidiShare.  Classes affected follow.

MidiIO - SysEx send support:
  • public void sysex( byte[] data)
  • public abstract void sysex ( double timeStamp, byte[] data);

  • MidiListener, SysEx receive support:


    MidiIO_MidiShare (sends sysex, receives sysex)
    MidiParser (supports SysEx input)
    MidiIO_MidiPort (does not send/receive SysEx, just prints a warning)
    MidiIO_MidiPortLegacy (does not send/receive SysEx, just prints a warning)
    MidiIO_JavaSound (does not send/receive SysEx, just prints a warning)

    For an example of how to send SysEx, see JMSLTestSuite.TestMidiSysexSend
    For an example of how to receive SysEx, see docs for com.softsynth.jmsl.midi.DefaultMidiListener
     

    * JScore Midi Instrument does not send a Program Change on open() if program = -1

    * MidiIO_MidiShare calls Midi.SendIm() instead of Midi.Send() for non-timestamped midi output

    * Fixed bug in JScore's MidiScoreInstrument which did not sustain tied notes.

    * Removed all references to Score.get/setTimeAdvance.

    * DefaultMusicClock's constructor now inherits current JMSL.clock's timeAdvance.  So you can setTimeAdvance, then create a new SynthClock for example, and the timeAdvance will carry over.

    * JMSL class now has a public double JMSL_VERSION, for future version requests.

    * JMSL.requestVersion() allows users to request a version of JMSL

    * MusicJob now has a public boolean isRunning() method which is true while the MusicJob is executing, false otherwise.  All subclasses (ParallelCollection, SequentialCollection, MusicShape, etc) inherit this method.  Useful if, for example, you want to launch a MusicShape based, say, on live performance input, but only launch it if it's not already running.

    * JScore displays instrument name on each staff at beginning of each line (used to only display its name if instrument changed)

    * Fixed JScore alto/tenor clef swap bug

    * Fixed JScore bug that did not restore measure widths that were changed by hand, when a score was loaded from disk.

    * JScore: Default measure width max. Measures whose timesigs have greater total duration than 8/4 will have an initial width that is no greater than the width of an 8/4 measure.

    * JScore, ScorePainter only creates new Font if zoom changed. Saves some unnecessary garbage collection.

    * JScore PageUp/Down moves renderer up/down by one entire staff at a time. Home key sets first staff to render=0

    * new class: com.softsynth.jmsl.view.JMSLClockAdvanceFrame, a Frame which opens with a Scrollbar to change JMSL.clock advance time

    * Added JMSL.clock advance menu item to JScore

    * ScoreLayoutManager has a wrap flag, settable from ScoreFrame menu, which toggles system layout wrap/nowrap

    * Made methods in Translator public

    * added Synth.FLAG_AUTO_STOP to sample queuing of TransposingSamplePlayingInstrument

    * new instrument: TransposingSampleSustainingInstrument, queues up sample loop with crossfades for smooth sustain

    * MusicShapeEditor

    * JScore supports additional tuplets 9 and 13

    * Score now has public static void useSharedCanvas(boolean f)
        If true, all scores render to the same static canvas (current and default behavior).
        If false, each Score gets its own canvas (you may quickly run out of memory doing this).

     * Score.ownCanvas() is public now, so you can pull out a scorecanvas from a score and put it in your own GUI.

    *  public ScoreCanvas getScoreCanvas() is NO LONGER static!!!  See jmsltestsuite.NotateTest for an example of multiple Score canvases in the same layout

    * Limits.randomStep() now returns the (double) result of the random walk's step

    * com.softsynth.jmsl.util.Tuning uses double pitchIndex instead of int pitchIndex now.

    * SynthNoteInstrument now supports user-defined tunings with setTuning(Tuning t)

    * com.softsynth.jmsl.score.jsyn.SampleLoader now maintains Hashtables of filenames pointing to SynthSamples and filenames pointing to short[], so that loadSample() and loadShorts() avoid reloading the same sample twice.

    * Score now maintains boolean isApplet flag, and static boolean getIsApplet() and static setIsApplet().  Used by classes that need to know (ie sample loaders who need to decide between loading a synthname from disk or from url)

    * New class com.softsynth.jmsl.score.util.JMSLScoreApplet for loading a JMSL Score files from a URL into an applet.

    * Score.addNote(double[] dar) now copies all dimensions to new note, including dimensions > 3

    * DimensionNameSpace support added - maps dimension indexes 0..n to user defined names.  Default Dimension Name Space maps (with min/max limits):
         dim 0 = "duration" 0..8
         dim 1 = "pitch" 0..127
         dim 2 = "amplitude" 0..1
         dim 3 = "hold" 0..8

    * JMSL Score has a Note Editor to edit notes parameters.  Double click on a Note to pop up editor. Or select a range of notes and choose Edit -> Edit Notes, which will allow the editing of all selected notes (to change their amplitude for example). If selected notes are being played by an Instrument with extended dimensions like modAmp, resonance, etc, these will show up in the editor as well.

    * New method for scoring algorithmically generated timbres Score.addNote(DimensionNameSpace dimensionNameSpace, double[] dar) .  See JMSLExamples.jsyn.JScoreMultiTimbralGenDemo

    * Transcriber now supports MusicShapes with dimension() > 4 and maintains their DimensionNameSpace

    * Some MidiIO_MidiShare cleanups by Stephane Letz (thanks!). Only uses one client now, and ReceiveAlarm properly calls Midi.FreeEv(ev) in all cases.

    * Fixed bug where JSyn menu items were not enabled when loading an orchestra from file

    * Added classpath scanning - looks for Unary/Binary Transforms and SynthNotes in classpath.  Builds hierarchical menus for these.

    * JMSL Score supports signal processing instruments - any JSyn SynthNote with an input port can be wrapped up in SynthNoteAllPortsInstrumentSP

    * Added signal processing patcher GUI to JMSL Score.  Any JSyn Instrument's output can be patched into a signal processing instrument.

    * JMSL Score Instruments that implement PlayLurker can now be added to any number of Staves' list of PlayLurkers, to be notified of notes being played on other staves (use to build a harmonizer or arpeggiator for example).

    * ScoreControlPanel now has public launch(time, startMeasure, endMeasure) method.  You can launch a score by doing myScore.getControlPanel().launch(JMSL.now(), 0, 2), for example.

    * MusicShape now has a dumpSource(String filename) method to generate Java source that can be used to recreate this MusicShape

    * com.softsynth.jmsl.score.tracnscribe now has a TranscriberListener interface, so you can register classes to be notified of Notes as they are being transcribed into a score (VERY useful!!! For example, use it to set dynamics on that note, or transpose into range of a particular instrument)

    * Score has static setInstrumentNamesVisible(boolean) method which toggles staves displaying ins names

    *Measure.setTempo() now has convenience paramters (int bpm, boolean visible) to flag tempo as being visible or not.

    * Score.addMeasure() now returns the new Measure added, so you can do things like this:
        Measure measure = score.addMeasure(3, 4);
      measure.setTempo(90, true);

        or better:

        score.addMeasure(3, 4).setTempo(90, true);

    * Score.addMeasure(Measure) is now protected.  Too dangerous (and annoying) to create a new Measure() outside the context of a Score then try to add it.

    * Tempo is now a double in JMSL Score

    * Transcriber now takes a Vector of TempoTimeSignatureHolder so that time sig and tempo can change from measure to measure.  A Tempo of 120 will result in timestamps that are 0.5 seconds apart to be transcribed as quarter notes in a measure with tempo 120.  Tempo can change every measure.

    * Staffnumber now displayed

    * added scrollpane to ScoreFrame so user can scroll up and down many staves

    * new Score() constructors which autocalculate score size from number of staves specified

    * Note.addInterval() returns boolean now, preventing adding duplicate pitches to a chord and guards against adding a rest to a chord or an interval to a rest.

    * Score.addInterval() return Note or null if Note.addInterval() returned true or false.

    * Score's Note now displays text: setText() and getText() and x, y graphic offsets setTextOffsetX[Y](), getTextOffsetX[Y]()

    * Score(int numStaves) constructor will create width, height dimensions based on # staves and user's screen resolution