1/21/05 Commented out System.out.println() in various XMLLoaders when content was found 1/23/05 Bug fix: Commented out debugging code that threw runtime exception when Note data[1] != perfData[1], held over from old problem that was solved. Dies when using 8va/vb 1/24/05 Sampled Leo's drum set and replaced Alesis, change reflected in sample score Miserable Sinner Mated 1/26/05 Bug fix: MIDIFileToMusicShape bug fix: tracks that do not start at 0 corrected differentiated 1/26/05 Bug fix: TranscribeMidiFile no longer calls MIDIFileToMusicShape.startAtZero() SHIPPED AS BUILD 20050213 3/7/05 Changed DeleteMeasureRangeDialog to MeasureRange Dialog, reused for insert mult measures 3/7/05 Insert multiple measures menu item in ScoreFrame and in EditManager 3/7/05 MusicShape.fill() 3/14/05 TempoDialog moved to score.view package, fixed CANCEL bug 3/14/05 Moved all Transforms out of score package and into new score.transforms package 3/15/05 RestToggleTransform set amp = 0.5 when changing back from rest to pitched note 3/15/05 ScoreControlPanel has public setLoop(), getCurrentSection(), and launchSection() methods 3/15/05 jmsltestsuite.MultipleScoresDemo3 shows buttons that launch, finish, play section, and loop 3/15/05 Select All in Staff, new item in Edit Menu, and EditManager 4/17/05 SimpleSamplePlayingInstrument.play() refactored to call on() which fires sample and stores the voice allocated to sound the sample 4/17/05 Implemented SimpleSamplePlayingInstrument.off() to shut down samples currently sounding for specified noteIndex (looks up voice stored in on()). So long samples can be shut down gracefully on a per-pitch basis 4/17/05 Clearer docs in SimpleSamplePlayingInstrument, other sample playing instrument, and tutorial covering where samples should be stored in applets SHIPPED AS BUILD 20050417, licensed only 4/23/05 WeightedObjectChooser has new methods size() and contains() 4/23/05 new Markov Chain utility com.softsynth.jmsl.util.MarkovObjectChooser 5/3/05 BUG FIX: TransposingSampleSustainingInstrument, duration of release portion of sample was not included in overall duration calculation so samples would sustain beyond intended dur. 5/3/05 BUG FIX: TransposingSampleSustainingInstrument, timeStretch was not included in duration calculation so samples at faster tempos would sustain beyond intended dur. 5/3/05 BUG FIX: TransposingSampleSustainingInstrument rewritten to use new VariableRateSampleReader envelopes instead of writing envelope data. 5/3/05 BUG FIX: VariableRateSampleReader has envRate SynthInput now, used instead of writing to env data to change env release durations and crossfade durations. All end data writing methods removed. Much better since writing data to an envelope at runtime is not a timestamped operation, and wastefully creates many synth units 5/8/05 Feature: TransposingSampleSustainingInstrument, use ins's Tuning to calculate sample rate for transposed pitches. So now you can play non-12tet tunings with samples. Important: mapped pitches must be assigned to samples that are actually in the tuning! 5/9/05 BUG FIX: TransposingSamplePlayingInstrument, release length included in calculation of duration. Ends at expected time now. 5/9/05 BUG FIX: TransposingSamplePlayingInstrument, loops an integer number of times instead of queueLoop'ing and breaking out early . This avoid glitch when cycle of pitched instrument in loop gets interrupted by jump into release 5/9/05 BUG FIX: TransposingSamplePlayingInstrument, timeStretch was not included in duration calculation so samples at faster tempos would sustain beyond intended dur. 5/14/05 BUG FIX: WAVRecorderPanel, the WAV file it recorded was locked until System.exit(), preventing other applications like audio editors from opening the WAV until your JMSL app exited. Affected all recording done with JSynMixer. 5/16/05 Feature: TransposingSampleSustainingInstrument uses POLYPHONY field defined in SimpleSamplePlayingInstrument now (default 32) 5/16/05 Feature: array of SynthSample in SimpleSamplePlayingInstrument and subclasses has been replaced with Hashtable for unlimitted pitch -> sample mappings 5/16/05 Feature: TransposingSamplePlayingInstrument and TransposingSampleSustainingInstrument now share a common superclass SimpleSamplePlayingInstrumentWithLoops which is SimpleSamplePlayingInstrument adding a hashtable of loop regioners to handle sustain 5/16/05 Feature: SimpleSamplePlayingInstrument and subclasses may override public int getAlternativeSampleIndex(int pitchIndex, double timeStretch, double[] data) to load alternative samples based on performance data (see new demos next line) 5/16/05 Feature: jmsltestsuite includes examples of instrument classes that have amplitude mapping sample playing instruments. SimpleSamplePlayingInstrumentWithAmplitudeMap, TransposingSamplePlayingInstrumentWithAmplitudeMap, and TransposingSampleSustainingInstrumentWithAmplitudeMap 5/24/05 Bug Fix: TuningTable. pitches in octave below reference pitch were mistakenly calc'ed as octave 0 instead of octave -1. Result is transposition error for pitches in octave below reference pitch. 5/24/05 Bug Fix: TuningTable, octave stretch erroneously distributed octave stretch over frequencies on tuning table instead of making jumps at octave boundaries 6/08/05 Bug Fix: MidiIO_JavaSound maintains its synthesizer instead of nulling it out when it close()'s. Prevents memory leak when midi is open()'ed and close()'d repeatedly (thanks to Ben Childs for reporting this error) 6/13/05 Bug Fix: update() in FreqSynthNoteInstrument, TunedSynthNoteInstrument, and SynthNoteAllPortsInstrument now supports setUpdateDimension() for dim other than pitch (1) to support pitch updates (see jmslexamples.jsyn.PitchGliss) 6/14/05 Enhancement: Added SynthContext constructors to all SynthNotes in com.softsynth.jmsl.jsyn.circuits 6/20/05 Enhancement: SynthNoteAllPortsInstrument.update() checks if SynthNote.amplitude is null before setting it, same for frequency port. 7/17/05 Removed com.softsynth.jmsl.util.FFT 7/18/05 Added JMSL.setViewFactory(new ViewFactorySwing()) to JMSLMaxNotate SHIPPED AS BUILD 20050718, both licensed and unlicensed 9/9/05 Workaround: JMSLMaxNotate.java, Moved addScore() to end of transcribe(). Was hanging Max/MSP if it was added before scoreframe was visible. (why?) 9/17/05 Bug Fix: Transcriber sets amplitude of tied notes to amplitude of original note instead of 0 (RestsToTiedNotes.java) 9/19/05 Bug Fix: Swing did not show scrollbars when bigger score loaded. 9/22/05 Enhancement: MIDIFileToMusicShape.setDebug(false) suppresses ALL console printing 9/27/05 Feature: Multiple JSyn Device support in com.softsynth.jmsl.jsyn.JSynMusicDevice SHIPPED TO ACCENTUS 10/02/05 Feature: TempoUnblockingOperator clears TempoSetByHand flag on contiguous measures with same tempo 10/02/05 Refactoring: New package com.softsynth.jmsl.score.operators, moved DurationReporter into this package. 10/17/05 SHIPPED NEW JMSL LICENSE MODEL, ALL FEATURES ABOVE RELEASED WITH IT JMSL v1.035 begins 11/12/05 Bug fix: under jre 1.5.0_05, JSynInitDialog was not showing audio devices. Now call SynthContext.initialize() and terminate() before and after enumeration 11/14/05 Justified layout of Notes, from D. Blostein and L. Haken, "Justification of Printed Music," Communications of the ACM, Vol. 34, No. 3, March 1991, pp. 88-99. (have not implemented tuplet exception yet) 11/14/05 ScoreFrame menu item to set measure widths to linear or flexible (linear for Zero Waste for example) 11/15/05 Justifier.setDurationalSpacingBase() controls how much a note's duration influences layout in non-linear duration spacing formula 11/15/05 JMSL_Score_prefs now saved and loaded from user.home/.algomusic 11/15/05 durational spacing base saved&loaded from JMSL_score_prefs 11/28/05 feature: implementated tuplet handling from Blostein's "Justification of Printed Music" algorithm 11/28/05 Bug fix: sample directory properly loaded and saved in JMSL_Score_prefs 11/28/05 Initial width of measure calculated linearly proportional to time signature up to 5/4, so a measure of 3/8 will initially be smaller than a measure of 5/6, etc JMSL v1.036 begins 12/03/05 MULTIPLE TRACKS ON A STAFF NoteFactory does not set stem direction of Note if Note is part of a multitrack staff. If staff is multitrack, track lay out notes stem down if index < staff.size()/2, else stem up Removed Staff.setMultiTrack(boolean), which did nothing. Staff.getMultiTrack() returns true if staff.size() > 1 12/04/05 new method insertMeasure() in Score, a convenient delegate for score.getScoreCollection().insertMeasure() 12/04/05 Staff automatically given two tracks when constructed (CHANGED TO n TRACKS SEE 2/3/06) 12/05/05 New method getActiveTrackIndex() in EditStateProvider 12/05/05 ScoreEditPanel now has radio buttons to choose between track 0 and track 1 to enter notes (CHANGED TO n TRACKS SEE 2/3/06) 12/12/05 256th notes possible now 12/12/05 increased number of noteheads types from 2 (black & white) to 16, for future X noteheads, diamonds, for eaxmple 12/12/05 expanded Note accidental field for quarter tones 12/18/05 x, x-oval, diamond, black diamond noteheads, also change when durations changed 1/1/06 Quarter tone accidentals calculated by NoteFactory.setLevelPitch() and rendered by NoteRenderer. 1/2/06 EditManager.selectAll() public now 1/2/06 quarter tone +/- transpose menu items in ScoreFrame's Note -> transposition submenu 1/2/06 NoteFactory.useQuartertoneAccidentals() to turn quarter tone acc feature on/off 1/2/06 Quarter tone accidentals export to MusicXML, import to Finale ok 1/21/06 com.softsynth.jmsl.view.DimensionNameSpaceCreatorDialog is a Dialog to create a DimensionNameSpace from scratch. Use to create custom DimensionNameSpace for a JMSLMax instrument for example. 1/27/06 bug fix: Note.play() used data[0] not getPerformanceData[0] for duration if instrument was null. Now uses perf data 1/28/06 new static method Note.performExpressionMarks() will ignore or use expression marks staccato, accent staccato, and tenuto to calculate hold time 1/28/06 ScoreCollectionBehavior has new public getCurrentMeasureNumber() so you can query which measure is currently playing without using a PlayLurker, see jmslexamples.MultiplScoresDemo3 2/03/06 Score has set Num TracksPerStaff method, used by Staff to initialize number of tracks per staff and by ScoreEditPanel to gen track select checkboxes 2/05/06 Renamed DimensionNameSpaceEditPanel more appropriately as DimensionNameSpaceValuesEditorPanel 2/05/06 Feature: Max support becomes part of core JMSL 2/20/06 Feature: refactored SimpleSamplePlayingInstrument: you can access voices hashtable which map sample players to pitches 2/20/06 Feature: refactored TransposingSamplePlayingInstrument: calcRateForTransposition() public method 2/20/06 Feature: You can now name "hold" and "duration" as SynthInputs in your SynthNote and SynthNoteAllPortsInstrument will send data to these ports. Useful if for example you want to control envelope rate with hold time 2/28/06 Feature: No longer need JMSLScriptMaker.jar JMSL ships with scripts that launch ScoreFrame and compile wire patches, dynamically building classpath 2/28/06 Feature: Smarter plug-in scanner. JMSL plug-in developers can now simply make a JAR file and drag it into jmsl_plugins JMSL will find them and make them available in ScoreFrame 3/30/06 Bug Fix: Mark none sometimes did not work. Fixed. "none" menu item name clashed with dynamic "none" menu item, score command center looked up wrong transform (Dynamic "none") (thanks to LP for reporting this bug) 4/01/06 Feature: Score.set/getTempoVisible(), turn on.off tempo rendering (for LP) 4/8/06 Feature: SimpleSamplePlayingInstrument new methods loadSample(SynthSample sample, int noteIndex) and loadSample(short[] shorts, int noteIndex) for dynamically created sample data Subclasses that loop samples for sustain also support loadSample(SynthSample sample, int noteIndex) but you must prepare a SynthSample with cuePoints like so: SynthSample sample = new SynthSample(sampleData.length); sample.write(sampleData); sample.cuePoints = new java.util.Vector(); sample.cuePoints.addElement(new CuePoint(100, 1)); sample.cuePoints.addElement(new CuePoint(10000, 2)); ins.addSamplePitch(sample, 60); Thanks to Aron Glennon for suggesting the need for these features. 4/8/06 PUNOSMUSIC PLUG-INS SHIP WITH JMSL NOW: MelodyToChordTransform AmplitudeCescendo DoubleBelowTransform RandomDimensionValuesTransform SerialTransform DumpSelectedToMusicShape ExtremeLevelReporter GridEntry MarkovOperator RestReporter TotalSelectedDurations 4/11/06 Bug fix: JMSL Score printing supports landscape properly now. Feature: ScorePagePrinter.setPrintPageNumbers(boolean) flags printing page # at bottom of each Score page SHIPPED AS BUILD 20050411 4/14/06 BUG FIX: NewJMSLScore, fixed makeScore command which hung Max in Tiger 10.4 (cannot addScore until ScoreFrame visible) 4/14/06 BUG FIX: adding interval to Note copies over DimensionNameSpace and sets default values on new interval 4/14/06 BUG FIX: Turned off posting data in JMSLInstrumentToMax SHIPPED AS BUILD 20050414 JMSL v1.037 begins 4/18/06 BUG FIX: EventScheduler was comparing event times against JMSL.now() instead of JMSL.realTime() NoteFlasher and ScorePainter no longer add getAdvance() to scheduled event time 4/18/06 BUG FIX: SimpleSamplePlayingInstrument needs PUBLIC addSamplePitch() !!! 4/20/06 Change: MusicShape.copyDataFrom() Each double[] from the source is copied to a new double[] array before adding to destination. 4/25/06 Suppressed Null Mixer printlns 4/25/06 Suppressed MaxInstrument numoutput, getoutput println warnings inheritted from InstrumentAdapter 4/30/06 ScoreCanvasSwingJPanel.requestFocusInWindow() instead of ScoreCanvasSwingJPanel.requestFocus() 5/18/06 BUG FIX: multitrack marks rendered above/below notes 5/18/06 BUG FIX: multitrack cresc/decresc rendered above notes for stem-up tracks 9/29/06 Feature: new callback from ScoreCanvasListener scoreCanvasDisplayedImageReady(), permits drawing on top of rendered score [ thanks Jason Freeman ] 10/17/06 Feature: MusicShapeEditor has a Save button which lets you dump Java source code for currently displayed MusicShape 11/21/06 Feature: Alternate Enharmonic spellings supported in Score. Note.setAltEnharmonicSpelling(boolean). Spells double sharps, double flats, E#, Fb, etc [ thanks James Ray ] 11/28/06 Feature: LilyPond exporter (see com.softsynth.jmsl.score.util.LilyPondWriter writes JMSL Score to LilyPond format [ thanks Larry Polansky ] 11/28/06 Feature: Score adds two new data fields set/getComposer(), set/getCopyright(). Lily Pond uses composer in header 11/28/06 Feature: JMSL_score_prefs now remembers distinct dirs for exporting musicXML, midifile, lilypond, etc 11/30/06 Feature: MusicShapeEditor has additional constructors to sepcify startup values for Font, zoom, show grid, and lock to int 11/30/06 Feature: MusicShapeEditor has PVPanel getUserPanel() method which returns an empty PVPanel. You may set its layout, add components, etc. Shows up at the bottom of MusicShapeEditor 11/30/04 Feature: new NoteFactory methods: makeNote(double[] data); and makeNote(DimensionNameSpace dns, double[] data); 11/30/06 Bug Fix: Note.addInterval(Note) upper dimensions greater than 3 were not preserved when interval added to Note 11/30/06 Bug Fix: Transcriber did not add all upper dimension values to chord intervals 12/01/06 Feature: range select in MusicShapeEditor 12/02/06 Feature: floor, ceiling, and invert lines in MusicShapeEditor 12/02/06 Feature: MusicShapeEditorOperator interface permits adding user-defined operations to MusicShapeEditor Standard operators included scramble, sort, invert, reverse, scale, transpose 12/02/06 Feature: MusicShapeEditor has NON-modal editing now (!!!): Clicking close to a point puts you in draw edit mode. Clicking close to a horizontal line moves the line as you drag Clicking in the bottom gray margin selects range. 12/04/06 Feasure: com.softsynth.jmsl.score.view.ScoreMusicShapeEditor allows user to pull in Notes from a Score into a MusicShape, manipulate it, and transcribe back into Score 12/04/06 Feature: ScoreFrame includes ScoreMusicShapeEditor in its operator menu 12/04/06 Feature: vertical zoom +- button in MusicShapeEditor 12/08/06 Feature (and possible code breaker): ScoreCanvasListener includes mousedragged info and mousepressed info. Now you can interactively draw on a Score. See jmsltestsuite.DrawWithMouseOnScore 12/23/06 Feature: MusicXML export includes Score.getComposer() in identification 12/23/06 Feature: MusicXML export support double sharps and double flats SHIPPED AS v1.037 on 20061227 03/06/07 Fix: SimpleSamplePlayingInstrument's constructor now set DimensionNameSpace to defaultDimensionNameSpace, so all sample playing subclasses will have this too. 03/12/07 Feature: Note has private Vector of Beans. So you can addUserBean() and getUserBeans(). For Peter McCullough who wanted to attach a unique primary key to each note created. 03/12/07 Feature: EditManagerListener can be notified when notes are added into a score by hand, pasted, or when ScoreCommand is executed. For Peter McCullough 04/28/07 Bug fix: accidental placement before notes in chords much improved. Various exceptions handled. 04/28/07 Bug fix: If two notes in same chord have same level, acc of both shown now, & forces acc to be shown for next note in same measure 05/08/07 Feature: setNoteheadColor() allows user to use API to change note rendering color. 05/15/07 Feature: ScoreFrame tempo and timesig changes now use ScoreCommands and so, are undoable and listenable through EditManager 05/27/07 Feature: Note visibility can be turned on / off. NoteVisibleTransform toggles 05/27/07 Feature: measure.setPeriodDouble bar (one thick one thin line) Thanks Georg Hajdu 06/05/07 Feature: Score.setStaffNumbersVisible(), Score.setMeasureNumbersVisible(), Score.setTempoVisible(), Score.setSectionBracketsVisible() SHIPPED AS v1.038 on 20070605 06/11/07 Bug Fix. Note.addInterval(), interval now inherits beaming attribute of chord. Adding an interval to a beamed note used to sometime break beaming. Thanks Georg Hajdu 06/12/07 Bug Fix. Accidental placement bug for whole notes fixed (offset too far left for whole note dyad). Thanks Jason Freeman. 06/19/07 Feature: Insert Measure, Insert Staff, and Delete staff are now ScoreCommands, and so are undoable and redoable 06/19/07 Feature: DeleteMeasureCommand has accessors to return the measure and index of deleted measure 06/19/07 Fix: EditManagerListener no longer has measureDeleted and measureInserted methods. Use scoreCommandExecuted() to derive this info instead. 06/19/07 Feature: EditManageListener has scoreCommandUndo and scoreCommandRedo callbacks 06/25/07 Change: Score XML format. Instead of two boolean attributes for cresc and decresc, one attribute wedge with values none, cresc, or decresc 06/25/07 Change: Score XML format. Instead of two boolean attributes for 8va and 8vb, one attribute ottava with values none, bassa, or alta 06/25/07 Bug fix: If all notes in a chord are toggled to rests, all rests are rendered in same location instead of two side-by-side locations 06/26/07 Feature: antialiased score rendering. Score.setAntiAliasingHints(flag) turns altialiasing on/off. Default is ON. Thanks Peter McCullough 07/07/07 Change: 8va and 8vb logic changed. Now you can set 8va/b on a single note. This will break existing scores with 8va/8vb since the last note of a sequence of 8va/b notes used to have 8ba/b set to false to terminate, yet would be included in the 8va/b. So an old score with three notes under 8va will only show two notes under 8va when loaded into new version of JMSL. Thanks Peter McCullough 07/07/07 Feature: New Punosmusic ScoreOperator ExtendOttavaRunsByOneNote. Run this ONCE on your old scores to extend each ottava run by one note to conform to new model. You will find this under Score -> ScoreOperators (plug-ins) 07/07/07 Feature: Measure XML format now has a single BARLINE property which is single, double, period, or none (which hides right barline). Thanks Georg Hajdu and Adam Siska 07/07/07 Bug fix: period double bar exports ok to LilyPond, San Andreas Press SCORE, and MusicXML 07/10/07 Bug Fix: NoteProertiesTransform redo would not always work right for sequence-sensitive selections like cresc/decresc, since notes were processed out of order. Fixed. 07/15/07 Feature: static Score.setTimeSignaturesVisible(flag). Optionally hide all time signatures. 07/15/07 Feature: static Score.setClefsVisible(flag). Optionally hide all clefs 07/15/07 Feature: ScoreFrame now has a separate menu for all show/hide attributes (except note visibility which is a note properties transform and remains in Note menu) 07/27/07 Improvement: rearranged ScoreControlPanel layout to make it more compact 07/27/07 Feature: ScoreControlPanel has buttons to jump to section start and section end 07/30/07 Feature: PVComponent.getLocation() 07/31/07 Feature: added more info to score shortcut frame 08/03/07 Feature: tightened up JMSLMixer panels and JSyn compoenent panel with smaller font and tighter layout. Results in smaller mix window 08/29/07 Bug Fix: LilyPond exporter. If last measure has repeat count, lilypond displays it properly now 08/29/07 Feature: Measure has measure text field now, with x, y, offsets. Exports to Lily Pond as left justified rehearsal marks. 08/31/07 Feature: LilyPond export generates part printing .ly files now. If an instrument name is of the form "longname_short name" the exporter will tokenize and use the first bit as the long name and second chunk as the short name 09/10/07 Feature: pitch spelling "line of fifths" algorithm added to Transcriber, also added as a NotePropertiesTransform menu item. 09/11/07 Major change: EventScheduler no longer uses Thread.sleep() and interrupt. Now uses wait(timeout) and notifyAll(). EventScheduler was causing stuttering scheduling on some platforms and in some JVM's. 09/13/07 Bug Fix: Note Flasher, sometimes first note of a measure after a page turn got stuck in flashed-on mode. 09/13/07 Bug Fix: If audio hardware is turned off, JSyn MusicDevice.open() threw runtime exception which prevented a Score from loading. Now prints warning to System.err, permits score to load. 09/15/07 Feature: ScoreFrame's mixer frame opens tucked in bottom right of screen instead of top left where it obscures the score. 10/22/07 Bug Fix: LilyPondWriter quotes all Note text to ensure that weird characters like {} and # are sent to markup command ok 10/22/07 API change: JMSLRandom.gauss() is deprecated since it was misdocumented. As implemented, gauss()'s first parameter is understood to be variance, not standard deviation as was documented. Use gaussSD() or gaussVar() instead. Pieces will continue to work a with expected behavior, but users should know that values passed to gauss() are understood to be variance, not standard deviation. 10/30/07 Bug fix: measure text, note text, and section names now properly encode and decode double quotes when reading from and writing to XML 10/30/07 Bug Fix: TuningTable generated wrong octave if referencePitch % freq.length != 0 11/02/07 Change: MidiIO.setQuiet() expects subclasses to implement quiet mode, which should be midi logging enabled, but no message sent to MIDI device 11/02/07 New demo: jmsltestsuite.MidiLoggerNonRealTimeTest creates a MidiFile by playing MusicShapes, a MusicJob, and MidiInstruments. Play the hierarchy silently in non-realtime and logs to MidiFile. Good way to use JMSL classes and scheduler to write a MIDI file in quiet non-realtime. Thanks Douglas Repetto SHIPPED AS v1.039 on 20071103 11/04/07 feature: Note.writeXML() take optional flag to not include intervals in dump. For MaxScore project 11/07/08 feature: rewrote JMSLMaxNotate with capture(pitch, vel) message instead of pitch and vel attributes and a bang message. Fixes bug on Intel Macs running Universal MaxMSP where notes were not captured. Thanks Chapman Welch 11/13/07 change: removed Line of Fifths note spelling transform from transposition transform 12/02/07 feature: scoreframe prints helpful error if security exception is thrown (probably forgot to JMSL.setIsApplet(true) when opening a ScoreFrame in an Applet) 12/03/07 feature: BeanEditor now includes option BooleanListener to provide callback after user clicks OK or CANCEL 12/04/07 bug fix (MaxMSP + Mac): AmplitudeTransform no longer uses modal dialog, no longer hangs MaxMSP on the Mac when used in MaxScore 12/04/07 bug fix (MaxMSP + Mac): PunosMusic plug-ins no longer use modal BeanEditor, no longer hang MaxMSP on the Mac. 12/10/07 workaround: JSynMusicDevice reports JSyn version correctly now by using reflection on Synth.VERSION (else version was getting compiled inline instead of retrieving it at runtime) 12/19/07 feature: ScoreCommandCenter.getScoreCommands() and ScoreCommandCenter.getHotkey(ScoreCommand cmd). For Peter McCullough 12/24/07 bug fix: Instrument plugin scanner skips abstract instruments 12/26/07 bug fix: key signatures are displayed before time signatures instead of after. Thanks Georg Hajdu 12/26/07 bug fix: staff draws cancelling key signature using all naturals if key sig changes to C/Am from a different key signature in previous measure. 12/27/07 feature: ctrl-click and drag a note up and down to transpose pitch, undoable and redoable 12/27/07 feature: MusicShapeEditor has getMusicShapes() method, returns Vector of MusicShapes contained in it 12/28/07 bug fix: ScoreMusicShapeEditor - finish()'es MusicShape when window closed 12/28/07 bug fix: Score saver now uses custom String replace(s, s), some versions of Java did not have String.replace(String String) and saving broke. 12/29/07 bug fix: Transcriber no longer sets tempo of measures if tempo not specified in TimeSignatureHolders. Used to set to 60bpm 12/30/07 feature: autobeaming: autobeams notes when they are entered by mouse, when halved, doubled, or tuplet changed. Switchable on/off. Also AutoBeam transform for selected notes that user can select. Thanks John King. 12/31/07 feature: Dan Ross's Grid Entry plug-in, some improvements by ND, includes: [x] loop plays current pattern using instrument from destination staff, updates in real-time so you can listen and edit before committing [x] uses transcriber instead of addNote() for good beaming [x] sounds instrument when you click on grid SHIPPED AS JMSL v1.039, build 20080102 on 1/3/08 01/06/08 Changed ctrl-click on note to alt+shift+drag note to click and note and transpose up and down. (since Ctrl click does not work on OSX) 01/06/08 jmsltestsuite.DrawWithMouseOnScore guards against alt+shift when drawing with alt down 01/06/08 feature and workaround: LilyPond export handles repeat count with volta bracket now, instead of "#x" mark. Lilypond does not permit more than one rehearsal mark per measure so "4x" would interere with a command like "trumpet solo" 01/08/08 feature: OrchestraXMLLoader can load from URL as well as filename 01/19/08 bug fix: transcriber scale tempo bug fix, which did not handle leading rests properly. Thanks Peter McCulloch 01/27/08 bug fix: ScoreFrame SAVE used to save score A loaded from dir A to dir B if score B was loaded from dir B after score A. Now each score hashes to its own directory for saving and save as 01/27/08 bug fix: ScoreFrame "save as" no longer renames score title from filename unless score title starts with "Untitled" 02/23/08 bug fix: noteFlasher no longer adds Score.getRenderDelay() to flash advance scheduling. Fix for low latency OSX. 02/23/08 fixed text in shortcut menu 03/25/08 Feature: Unbalanced repeat bar ScoreOperator in ScoreFrame Score menu. Important to have balanced ||: :|| bars in a score for LilyPond export. 03/25/08 Feature: LilyPond exporter checks for balanced repeats during export and generates warning. 03/25/08 Bug fix: LilyPond exporter now prints duration and unbalanced repeats report to System.err 04/14/08 change: license manager no longer calls System.exit() on unlicensed versions, but disables essential services instead. Friendlier for MaxScore or other situations where JMSL is hosted by another app 04/14/08 feature: pitches are rounded to nearest quarter tone for purposes of assigning staff level. So a note with pitch 60.9 displays as C# instead of middle C (used to truncate mantissa), and note with pitch 60.25 displays as 60.5 (1/4 tone sharp). 04/14/08 feature: MusicShape.setClippingEnabled() and isClippingEnabled() lets you switch on/off the clipping of values to MusicShape dimension min/max limits. Affects methods like transpose() and invert() 04/18/08 suppress println warnings when ScoreCommands with the same name are added to ScoreCommandCenter 04/18/08 bug fix: WriteScoreMidiFile won't scale amplitude to midi vel it if is already greater than 1 (ie if it is a midi vel already) 04/20/08 feature: WriteScoreMidiFile properly writes time signatures and tempo changes to MIDI file 04/20/08 feature: 15-tuplets 04/20/08 bug fix: WriteScoreMidiFile handles tied notes properly now 05/05/08 feature: Staves can show/hide 5 lines individually, and show/hide ledger lines, too. myscore.setLedgerLinesVisible(int staffIndex, boolean visible) myscore.setStaffLineVisible(int staffIndex, int lineIndex, boolean visible) Thanks Hans Tammen 05/05/08 TimeSigDialog no longer requires power of two for denominator. Thanks Georg Hajdu and Brian Ferneyhough 05/05/08 Bug fix: dotted 15 tuplet excluded from NoteFactory hash, since dotted quarter 15-tuplet has same duration as qtr quintuplet. Thanks Georg Hajdu SHIPPED RELEASE AS JMSL v1.039, build 20080505 on 5/5/08 06/14/08 ScoreEditPanel now offers x, bb, 1/4#, 1/4b menu items. Also, entering C or F with b selected spells pitch enharmonically now. Entering E or B with # selected spells pitch enharmonically now. Changes were made in NoteFactory. Thanks Peter McCullough 06/22/08 The following Score fields and their getters and setters, were changed from static to local. Thanks Peter McCullough showInstrumentNames showTempo showStaffNumbers showMeasureNumbers showSectionBrackets showTimeSignatures showClefs 06/29/08 Removed static Staff.set/getActiveTrackindex(). When using GUI like ScoreFrame, active track is determined by EditManager by get()ting its value from ScoreEditPanel. When you are using API, use score.set/getActiveTrackNumber(), like in jmsltestsuite.TwoTracksPerStaff for example. This way multiple score editors can maintain their own active track instead of setting one global static Staff field. Note that ScoreCanvasAdapter no longer reacts to EditStateChanged (it used to set Staff.activetrackindex). For Peter McCullough; glad to clean this up. Note that selecting the track in ScoreEditPanel does NOT change the score's active track index! It simply provides the track index for operations managed by EditManager (ie UI interactions) 07/12/08 BUG FIX: If a Note's UserBean cannot be instantiated when Score is loaded (for example if the userbean class is not in the classpath), noteXMLLoader mistakenly added NULL to Note's user beans, which resulted in not being able to save score any more (null pointer exception killed the save). Note NoteXMLLoader does not add NULL to user beans, which is correct behavior. IMPORTANT: saving this score will result in a score stripped of the references to thge original user beans so be careful. Scenario: user creates UserBeanX on one machine, creates a score with it and saves the score. This score contains references to UserBeanX class. Now load the score on a different machine without UserBeanX on it, and none of these beans will load. Save the score on this machine and there will be no references to UserBeanX any more. 07/12/08 Feature: new NoteOrnament abstract class. Define your own drawing ornament for a note. Add it to a note with addUserBean. Saves and loads back with the score. NoteOrnaments are scanned and loaded as plug-ins. Show up in Note menu of ScoreFrame. Wrapped in notePropertiesTransform so they are un/redoable. See jmsltestsuite.NoteOrnamentTest and jmsltestsuite.DrippyNoteOrnament and jmsltestsuite.SquigglyNoteOrnament To test plug-ins, compile Drippy and Squiggly and copy their .class files to a "jmsltestsuite" subdirectory of jmsl_plugins 09/06/08 Score.setScorePainter() is now a public method (for Peter McCullough). Warning this will probably disappear soon. 09/27/08 Track has user beans now, thanks Peter McCullough 11/01/08 Fixed bug where pitches 23.75, 35.75, 47.75 were rendered one octave too low. Thanks Georg Hajdu See jmsltestsuite.EighthTones for testing. Shipped as prerelease 20081101 12/13/08 Fixed bug in com.softsynth.jmsl.score.midi.WriteScoreMidiFile. Chord Intervals with Midi Velocities greater than 1 were being multiplied by 128, erroneously assuming they were amplitudes. Fixed, thanks Georg Hajdu 12/13/08 MIDIFileToMusicShape now taking absolute values of meta time signature data. Greg Wilder provided 2 MIDI files which included negative time signatures that crashed the midi file transcriber. 12/27/08 TiedNoteAccumulator sets hold time to accumulated duration. This fixes the problem Joel Mellin discovered when the transcriber extends long hold times with tied notes and lets them sustain the full hold time. 02/02/09 LilyPond export handles colored noteheads now. Thanks Joel Mellin for feature request. See jmsltestsuite.TwoTracksPerStaff 02/02/09 Notehead color attribute saved and loaded to/from score xml 02/02/09 Punos Music plug-in with text-only color chooser for Notehead Color. "NoteHeadColorTransform". Not a serious color chooser gui. 03/06/09 Music Font Rendering using Sonata font, major progress. noteheads, clefs, stems, expression marks, dynamics, time signatures 03/06/09 Bug fix: clicking on score canvas triggered two renders. Removed extra call to score.render() 04/06/09 ScoreFrame has support to use JavaSound MIDI, searches for soundbank.gm in classpath/javasound 04/06/09 run_jmsl_score scripts now include ../classes in classpath (so that javasound/soundbank.gm can be found) 04/8/09 MusicGlyphRenderers are per Score now, not static any more 04/14/09 Support for external MIDI devices in JavaSound MIDI (Thanks Chi!) 04/14/09 Default JMSL.midi is now MidiIO_JavaSound (no longer MidiShare) Shipped as prerelease 20090414 04/18/09 note stem visibility flag supported, transforms added to ScoreFrame's Note menu 04/18/09 added use MidiShare to ScoreFrame orchestra -> midi menu 04/24/09 Fixed bug in JavaSound noteoff which did not send noteoff to external device 05/02/09 MusicCurveRenderer interface allows user to do own line and curve drawing on Score prereleased to peter and georg 5/3/09 05/03/09 Measure.isBeginningOfLine() public now 05/16/09 MidiInstrument.useSparseMIDIProgramChange(true); MidiInstrument.clearMIDIProgramChangeTracker() Prevents MidiInstrument from sending redundant consecutive program changes on the same channel when instrument is open()'ed For Chi Kim 05/17/09 ScoreLayoutListener callback alerts starting measure on a page and num measures on a page 06/16/09 bug fix: 97.25 showed d three-quarter flat, while the note is actually in the one-quarter flat zone. score.deselectAll() synonym for score.getSelectionBuffer().deselectAndClear() 6/30/09 Ties: ties adjust width and x origin depending on how close together notes are. Note very close to each other had trouble displaying ties, fixed now. 7/01/09 Grace notes. Thanks Leo Didkovsky See jmsltestsuite.GraceNoteTest 07/07/09 setSelectionBufferNoteColor r g b 7/22/09 tremolos on note stem, new mark 7/22/09 a Note can have multiple Marks now. use addMark(int mark). addMark(Note.MARK_NONE) clears all marks 7/25/09 misc bug fixes for gracenotes related to beaming 7/25/09 Simple self modifing score example in jmslexamples.simple package. 7/27/09 Grace notes and tremolo marks export to LilyPond 7/27/09 If grace notes are selected, detach grace note transform will detach them from parent 7/27/09 grace note slash mark: acciaccatura 7/29/09 bug fix: percussion clef was not recognized by LilyPond writer 8/27/09 LilyPond export feature: when a staff has text on each note, exporter will write this text with "\addlyrics". Nice! 9/19/09 NoteRenderer send dummy no_accidental glyph message for notes who have no acc or hidden acc, so MaxScore can g get the accidental message and do microtones 10/03/09 Lilypond exports grace notes now, with some bug fixes esp for multi voice staves concerning stem direction, tie direction, and slur direction 10/23/09 Transcribe midi file bug fix: last timesig after a time signature change handled properly now 11/04/09 JMSL license checker uses Locale.US to parse license date. Fixes Thai Buddhist calendar issue. setNoteheadColor r g b setReportRenderTime true|false toggles the report of rendering time to Max window 01/30/10 new Score methods: isDrawCourtesyClefs(), setDrawCourtesyClefs() courtesy clef refers to rendering clefs in all staves when the clef in one staff changed. True by default 02/01/10 MusicGlyphRendererProxy now sending staff info for timesig and clef. MusicGlyphRendererProxy now sending measure numbers and staff numbers Note.setStemInfoOverride(int stemInfo) NoteFactory will use this value instead of setting it itself. where stemInfo is one of Note.STEM_NONE, Note.STEM_UP, Note.STEM_DOWN, or StemInfoOverrideTransform.CLEAR set/getMeasureNumberOffset measure number offset is a number added to measure indexes (which are zero based), for displaying measure numbers in score. Graphical only, no method calls refer to this (ie first measure is always measure 0 even if offset is non-zero 2010-02-03 Note stem info override and stem info saved/loaded to/from score xml 2010-02-22 Fixed bug in EditManager which prevented adding interval to a note in track 1 using the mouse 2010-03-11 Fixed whole note trill bug ("tr" would sink below notehead when note above certain staff level) Sent to Georg and Peter ("pure") as build 20100311 2010-04-26 When dragging a note up and down, checks if pitch is different before sounding a dragged note. otherwise a note dragged even by one pixel would make sound for no good reason 2010-04-26 bug fix: sometimes a note would draw a very tiny tie beneath itself. fixed. 2010-04-26 bug fix: sometimes the last note of a score draw a slur out. fixed. 2010-04-26 setLoopingPlayback affects playback (switch it off and it will stop looping), works kinda well, a little funky right now 2010-05-04 tag written to MusicXML for quarter tones, so Finale treats pitches properly 2010-05-24 MAJOR CHANGE: all Score rendering is done in double precision using Graphics2D 2010-05-26 bug fix: MusicXML exporter wrote instead of for notes that begin tie runs. (forgiven by Finale's Dolet MusicXML Importer but made Noteability crash (!)) 2010-06-01 RenderedMessageBean and listener. This is really cool. You can attach a message to measure, staff, or note which will be interpreted by a listener when the object is rendered. See jmsltestsuite.RenderedMessagesTest 2010-06-06 ScoreXMLLoader guards against negative scoresection indexes. Thanks Georg Hajdu 2010-10-22 Quieted all System.out.println()'s unless JMSL.verbosity == JMSL.VERBOSE 2010-10-22 The following methods help mange canvas ownership after a Score is loaded from a file or from a URL: (thanks Jason ) Score.isPermitOwnCanvasInBuild() getter and setter and ScoreXMLLoader.setPermitOwnCanvasAfterLoading(boolean ownCanvasAfterLoading) Score.load(String filename, boolean ownCanvasAfterLoading) When loading a Score from a file a no args Score() constructor is called. Attributes are accumulated as the scorefile is parsed. When finished, create() is called which in turn calls build() which in turn calls ownCanvas() This is fine unless you are sharing a Canvas (default behavior), in which case a Score which is already being displayed will disappear from view and the newly loaded Score will be rendered in its place. Setting permitOwnCanvasInBuild to false disallows a call to ownCanvas() in build(). Later you can add this Score to a ScoreFrame with scoreFrame.addScore(score) and the score will gain ownership of the canvas and be rendered as expected You can also set this back to true and call ownCanvas() programmatically This can only be set when using a no-args constructor. All other constructors call build() automatically. SHIPPED TO JASON FREEMAN AS PRERELEASE VERSION 20101022 2010-10-25 Added Score constructor with Score.isPermitOwnCanvasInBuild flag. Thanks Jason Freeman SHIPPED TO JASON FREEMAN AS PRERELEASE VERSION 20101025 2010-11-04 Changed meaning of isPermitOwnCanvasInBuild to isRenderAllowed flag. This blocks rendering. Sets renderAllowed to during load SHIPPED TO JASON FREEMAN AS PRERELEASE VERSION 20101104 2010-11-05 Bug fix: beaming, slur, 8va/8vb, cresc/decresc logic runs whether or not note is visible. Fixes bug discovered by Georg Hajdu 2010-11-22 added MusicJob getters for startPlayables, repeatPlayables, stopPlayables 2010-11-22 MusicJob.callPlayables() copies playables to a temp arr first and then iterates through the temp array to call play() on each. This prevents a bug where a Playable might remove itself from the stop playables, reducing the Vector size by and causing Playables that were added later to be skipped. 2010-12-26 ScoreControlPanel has public setNoteFlash() setter now 2010-12-27 Highlight selected staff in different color. You can turn this highlighting on or off with score.showHighlightSelectedStaffMenu(boolean) This highlighting is also switchable in the Show/Hide menu of ScoreFrame 2010-12-28 KeySignature topography fixed 2011-01-02 for flashing, noteheads are rendered in a different color instead of using xor circle 2010-12-31 score.getScorePainter().measureRendered() public now NoteRenderer.NOTE_HEAD_WIDTH and NoteRenderer.NOTE_HEAD_HEIGHT public now NO, reverted! 2011-01-08 New note selection methods in EditManager: selectAllNotesInMeasure(int measureIndex) selectAllNotesInStaff(int staffIndex) selectAllNotesInMeasureStaff(int measureIndex, int staffIndex) selectAllNotesInMeasureStaffTrack(int measureIndex, int staffIndex, int trackIndex) GENERAL PURPOSE MESSAGE FOLLOWS: IMPORTANT!!! "to" indexes are EXCLUSIVE!!! selectAllNotesInRange(int fromMeasureIndex, int toMeasureIndex, int fromStaffIndex, int toStaffIndex, int fromTrackIndex, int toTrackIndex) 2011-01-14 Select notes with pitch mod modulus = pitchClass in specified range: selectAllNotesInRange(int fromMeasureIndex, int toMeasureIndex, int fromStaffIndex, int toStaffIndex, int fromTrackIndex, int toTrackIndex, int pitchClass, int modulus) 2011-01-18 NoteFactory.setHoldScaler(double scaler) specifies what fraction of duration is assigned to hold time when a note is created 2011-01-24 Better GraceNote method in Note: public void addGraceNote(double duration, double pitch, double amp, double hold, boolean accPreferSharp, boolean beamedOut, boolean slurredOut, boolean tiedOut, boolean slashed, int mark) 2011-01-25 Using vertical line "|" as a line break delimitter for text attached to Notes (instead of backslash). Line height is g.getFontMetrics().getMaxAdvance() 2011-02-21 BUG FIX: note flashing on rest renders rest properly now instead of notehead 2011-03-15 Refactored FreqSynthNoteInstrument to use new AllocatedSynthVoiceLookup class, which lets TransposingSamplePlayingInstrument use same logic without redundancy TransposingSamplePlayingInstrument now support indefinite sustaining samples with on() and off(). Thanks Joel Mellin 2010-12-31 score.getScorePainter().measureRendered() public now NoteRenderer.NOTE_HEAD_WIDTH and NoteRenderer.NOTE_HEAD_HEIGHT public now 2011-01-08 New note selection methods in EditManager: selectAllNotesInMeasure(int measureIndex) selectAllNotesInStaff(int staffIndex) selectAllNotesInMeasureStaff(int measureIndex, int staffIndex) selectAllNotesInMeasureStaffTrack(int measureIndex, int staffIndex, int trackIndex) GENERAL PURPOSE MESSAGE FOLLOWS: IMPORTANT!!! "to" indexes are EXCLUSIVE!!! selectAllNotesInRange(int fromMeasureIndex, int toMeasureIndex, int fromStaffIndex, int toStaffIndex, int fromTrackIndex, int toTrackIndex) 2011-01-14 Select notes with pitch mod modulus = pitchClass in specified range: selectAllNotesInRange(int fromMeasureIndex, int toMeasureIndex, int fromStaffIndex, int toStaffIndex, int fromTrackIndex, int toTrackIndex, int pitchClass, int modulus) 2011-01-18 NoteFactory.setHoldScaler(double scaler) specifies what fraction of duration is assigned to hold time when a note is created 2011-01-24 Better GraceNote method in Note: public void addGraceNote(double duration, double pitch, double amp, double hold, boolean accPreferSharp, boolean beamedOut, boolean slurredOut, boolean tiedOut, boolean slashed, int mark) 2011-01-25 Using vertical line "|" as a line break delimitter for text attached to Notes (instead of backslash). Line height is g.getFontMetrics().getMaxAdvance() 2011-02-21 BUG FIX: note flashing on rest renders rest properly now instead of notehead 2011-03-15 Refactored FreqSynthNoteInstrument to use new AllocatedSynthVoiceLookup class, which lets TransposingSamplePlayingInstrument use same logic without redundancy TransposingSamplePlayingInstrument now support indefinite sustaining samples with on() and off(). Thanks Joel Mellin 2011-03-20 TimeSignature is not shown at start of new line unless it differs from previous measure 2011-03-22 Score has user-settable top, bottom, left, and right margins now. Score layout right justifies measure layout so each line of music extends to same far right margin 2011-03-28 calcDrawableDimensions() called by ScoreLayoutManager.layoutMeasures() automatically every time to adjust to margins that might change in medias res BUG FIX: first note of page would not flash. Fixed now. BUG FIX: notehead flashing x coord was off by a little fraction, fixed now. 2011-03-29 Score has subtitle field now, which is displayed below title, saves and loads to/from xml First page of score displays title, subtitle, and composer at top Score has topMarginOfFirstPage field now, to make room for display of title, subtitle, and composer Score has show/hide flag for title. Hiding title also eliminates extra top margin for first page. Saves/loads to xml, also has show/hide menu in Show/Hide ScoreFrame menu Score Subtitle writes to Lilypond export 2011-03-30 Score's EditManager checks before adding notes to selection buffer, avoiding duplicate notes added to selection buffer