jMusic Tools and 
        Utilities 
      Like many software projects, jMusic has some core and some additional 
        elements 
        . As you work more with jMusic the structure of these elements will become 
        more clear and also (hopefully) the reasons why jMusic is structured in 
        this way will be clearer. A rough guide to the jMusic hierarchy of classes 
        can be seen in the package structure 
         
        . If you have downloaded the source code simply open the jMusic directory 
        and see how the classes are arranged into a directory tree.  
        (The jm directory may be consolidated as a jm.jar file, if so, download 
        the source files 
        to see the directory organisation within the jm directory. But this is 
        not necessary to use the tools so don't get fazed if you don't have the 
        source.) 
      To use the data or tool classes you need, at the top of your Java file, 
        to import the appropriate directories: 
         
        import jm.music.data.*; 
        import jm.music.tools.*; 
        import jm.music.util.*; 
       
      Guess which package has all the tools, which 
        one has all the utilities and which one has all the musical data (Note, 
        Phrase, Part, Score etc.). 
      This tutorial will introduce you to the organisation of classes close 
        to the heart of jMusic, the arrangement of data, tools and utilities, 
         
        and how you can use these most effectively. 
      
      
          
      
      
      Data 
      At the core of jMusic is the jmusic/src/jm/music directory. In particular 
        the data classes, Score, Part, Phrase, CPhrase, and Note, 
        which hopefully you know intimately - or will. These data classes contain 
        all the musical 'content' for jMusic and also many methods for creating 
         
        or reporting on that data. 
         
        The manipulation of the music content is performed by tools in the jm.music.tools 
        directory, such as the Mod.transpose() and 
        Mod.repeat() methods. 
        As you develop jMusic pieces you may write a generally useful class which 
        can be included in the tools directory for others to utilise.  
        The AdaptiveMatrix class is one such tool that is a generalised Markov 
        matrix generator. 
      Anyway, on with the show. At the data level the data objects 'set' themselves 
        via their methods and we use tool classes, such as Mod 
        to transform them. So in the case of part.setTitle("Fred"); the title (name) of the part is 
        set to Fred. In the case of Mod.repeat(2); the phrase is changed by adding extra notes 
        to it so that it plays two more times through.  
      Utilities 
      In order to communicate with the outside world a set of utility classes 
        have been created. Communicating, in this context, includes displaying 
        a score on 
        screen, writing a score to a file, inputting a phrase as notation, reading 
        a MIDI file, and so on. 
        Utilities communicate with the data structure, rather than transform it. 
        Of course in practice this is a blurry distinction, but a helpful one 
        when you're getting started and want a clear explanation :) 
      At the utility level the data objects are 'translated' from (or to, in 
        the case of Read) an i/o device (screen, hard disk).  
        The data objects are not necessarily changed. 
        For example, the View methods translate the data into visualisations and 
        the Write methods translate the data into file formats.  
        Because the util methods use the jMusic data, a data object (usually a 
        score) is passed as an argument, as in: Write.midi(score, "FileName.mid");  
      Your Classes 
      In the classes that you write you can use any of the data, tools or utility 
        classes. 
        You can directly access the data and tool classes, and you can get particular 
        interpretations of the data as viewed through the various utility classes. 
        The rule of thumb is, if you want to 'manipulate' the data then access 
        the data classes and methods directly and if you want to 'render' the 
        data so you 
        can see it, or hear it, or store it, then use the util classes.  
      Hopefully, this is more straight forward in practice than this long-winded 
        explanation! Below is a summary of the functions performed by the util 
         
        classes, HelperGUI, Read, Write, View, and Play. As always, this tutorial 
        scratches the surface, and you should check the documentation 
        and 
        look at the source to get a more up-to-date and complete understanding 
        of the util functionality. 
        HelperGUI  
       
      The Helper GUI provides a visual interface that accesses many of the 
        other jMusic unitilies mentioned below.  
        It can be used by simply having your class extend the HelperGUI class 
        and adding a compose() method. 
        |