JFugue - Java API for Music Programming

Download JFugue

JFugue 4.0+ requires Java 1.5.0 at a minimum. A lot of Java Sound bugs were fixed in Java 1.5, and JFugue takes advantage of those fixes. JFugue 4.0+ also makes use of generics, varargs, and other 1.5 language enhancements. JFugue 2.1 still works with Java 1.3 and 1.4, and is provided below.

To make the most out of your download, you should check out The Complete Guide to JFugue!

Discussion Group and Forum: After downloading JFugue, you may be interested in joining the JFugue Users Discussion Group on Yahoo! Groups.

Important: The Tempo command has changed as of JFugue 4.0. It now represents beats per minute (BPM) instead of microseconds per beat, or pulses per quarter (PPQ). BPM = 60,000,000 / PPQ

jfugue-4.0.3.jar
Version 4.0.3
September 28, 2008
Get JFugue 4.0.3! This download contains the JFugue .class files. There are no source files or documentation in this file.
111 KB. See version information below
jfugue-4.0.3-with-musicxml.jar
Version 4.0.3
September 28, 2008
This version of JFugue contains the MusicXML Parser and Renderer, and the XOM library for parsing XML.
225 KB
jfugue-4.0.3-src.zip
Version 4.0.3
September 28, 2008
This contains the JFugue source code. You only need the source code if you want to make changes to it, or if you want to see how JFugue works.
jfugue-4.0.3-javadoc.zip
Version 4.0.3
September 28, 2008
This is a zip of the JFugue JavaDoc, also available online here.
jfugue-2.1.zip
Version 2.1
September 9, 2006
Download JFugue 2.1 only if you are restricted to using Java 1.3 or Java 1.4. This download contains the JFugue .class files, source code, and JavaDoc.

Add-ons

MIDI to WAV Renderer

Save your JFugue creations as WAV files. I you're using instruments from another soundbank, creating a WAV file will ensure that your listeners hear exactly what you're hearing.

License Information

JFugue is distributed under the LGPL license for all development purposes.

To get the most out of JFugue, and to show your support, please purchase The Complete Guide to JFugue - it's an excellent value that really helps you use JFugue to its fullest potential.

Version Information

JFugue 4.1 - Minor release. July 18, 2009

  • Lots of fixes to Tempo calculations
  • Fix to parsing durations of MIDI notes - no more "/1.0466666667" durations!
  • Fix to make parallel and sequential notes play correctly (C+E_G had sounded like C+E+G)
  • MidiParser now sends a note event with duration=0 to indicate a note has been started
  • JFugueElement (the interface common to Note, Voice, etc), Pattern, and Rhythm now implement Serializable
  • Separate download for JFugue with MusicXML, to cut down on library size
  • Fix to MusicStringParser to set the decimal duration of a note
  • Fix to allow Rs+Rs+Rs+Rs to sound correct
  • Added Player constructor that takes boolean, to creates MidiSequencer instance that is not attached to a particular synthesizer
JFugue 4.0.3 - Bug fix release. September 28, 2008
  • Lots of fixes to Tempo calculations
  • Fix to parsing durations of MIDI notes - no more "/1.0466666667" durations!
  • Fix to make parallel and sequential notes play correctly (C+E_G had sounded like C+E+G)
  • MidiParser now sends a note event with duration=0 to indicate a note has been started
  • JFugueElement (the interface common to Note, Voice, etc), Pattern, and Rhythm now implement Serializable
  • Separate download for JFugue with MusicXML, to cut down on library size
  • Fix to MusicStringParser to set the decimal duration of a note
  • Fix to allow Rs+Rs+Rs+Rs to sound correct
  • Added Player constructor that takes boolean, to creates MidiSequencer instance that is not attached to a particular synthesizer
JFugue 4.0.2 - Bug fix release. May 15, 2008
  • Changes to StreamingPlayer: now there are two methods, stream() and streamAndWait()
    • stream() should take only a String or Pattern containing a single token, and will return immediately. You'll need to manually throttle the music you send.
    • streamAndWait() can take a String or Pattern containing multiple tokens, and will take the time it needs to play each token
    • DurationPatternTransformer promoted from org.jfugue.extras to org.jfugue
    • The timing on streamAndWait() is still not 100% correct. Still looking into this. Suggestions welcome!
JFugue 4.0.1 - Bug fix release. May 11, 2008
  • Fix to Player(Sequence) and Player(Synthesizer) constructors, which weren't initializing the Player
  • Fix to the transform() method of PatternTransformer, which wasn't returning the correct Pattern
  • Re-introduced Player.allNotesOff() no-arg method
JFugue 4.0 - Major release. May 1, 2008
  • Changes to Tempo
    • Change: IMPORTANT - Tempo has changed. It now represents beats per minute (BPM) instead of microseconds per beat (or pulses per quarter, PPQ). BPM = 60,000,000 / PPQ
    • New: Constants defined for Tempo: T[Adagio], for example
    • New: public static final constants defined in Instrument, Note, Controller, and Tempo, to facilitate compile-time checking when creating object instances
  • Changes to Note parsing
    • New: Chord inversions
    • New: Triplets and other tuplets
    • New: Supports double-sharp (##) and double-flat (bb) notes
    • Change: Duration for 128th note is now "o" instead of "n"
  • Changes to the MusicStringParser and other Parsers/Renderers
    • Change: Improved MusicStringParser - quicker, and easier to understand and modify
    • New: JFugue Elements (Note, Tempo, etc) now have verification strings for verifying MusicString parsing
    • New: Support for MusicXML through the MusicXmlParser and MusicXmlRenderer
  • Changes to the Player
    • New: Pause, stop, fast-forward, or rewind a Player
    • New: Player can be created with pre-existing Synthesizer or Sequencer
    • Fix: Player now ends play when the music actually stops playing, as opposed to when it expects the player to be finished based on the millisecond length of the sequence
    • Fix: Exported MIDI now plays at the correct tempo
    • Fix: Multiple improvements to StreamingPlayer. New stream() method for sending new bits of music, instead of adding music to a pattern.
  • Changes to Pattern and PatternTransformer
    • New: Pattern now has user-definable properties, such as Author, Date, etc. These are persisted to/from a saved Pattern file
    • Change: PatternTransformer's 'returnPattern' now accessed through getReturnPattern() method
    • Change: PatternTransformer no longer has getName(), getDescription(), getParameter() methods
    • Change: PatternFactory and RockPatternFactory have been removed. Rhythm takes its place
  • Updates to Special Features
    • New: IntervalNotation class lets you specify a piece of music based on intervals
    • New: Rhythm class can now control voices (in addition to percussion layers)
    • Change: MicrotoneHelper changes: It's now called MicrotoneNotation, and the notation has changed from [note] to <note>
  • Experimental MusicalEffects class for ornamentation
JFugue 3.2
  • Ability to generate music at runtime using StreamingPlayer
  • Improvements for Anticipator class
  • New EasyAnticipatorListener class
  • New TimeFactor class to encapsulate timing and tempo calculations
  • Removed 'abstract' from PatternTransformer methods that are intended for use with a UI

JFugue 3.1

  • Fixes for sending and receiving music to/from external MIDI devices
  • New IntelligentDeviceResolver for selecting an external MIDI device automatically

JFugue 3.0

  • Significant updates to JFugue 2.1, including API changes
  • Support for reading MIDI files and converting MIDI files to Patterns
  • Additional play() methods to support multiple parameter types
  • New MusicString capabilities:
    • Fix for dotted note durations
    • Support for Channel Pressure, Polyphonic Pressure, Pitch Wheel (Pitch Bend),
    • Timing token to support MIDI parsing
    • KeySignature token, and Natural note modifier
    • Layers, to ease the creation of simultaneous percussion sounds in one channel
    • Ties
    • Bar Lines
  • Ability to send music to external MIDI devices
  • Ability to receive music from external MIDI devices
  • New Rhythm class makes creating rhythms intuitive and easy
  • New MicrotoneHelper class allows one to create MIDI of microtonal music
  • New Anticipator class lets you know about musical events before they happen
  • Re-architecture to support Parsers and Renderers