Histogram 
      The Histogram class can display a graph of how frequently particular 
        note attributes occur within a score. 
        For example you can see the number of times each pitch value is represented 
        in the score.  
        Feedback from histograms can be useful in providing information to a composer 
        about trends and tendencies in the music. It can also be useful for analysis. 
       
       
        
           
            |   Note data from the score is displayed as a series 
                of horizontal bars. 
                A ruler at the top of the display indicates the number of occurences. 
                The values of each bar are indictaed in the left margin. 
              The Histogram class can produce graphs 
                for any note pitch, rhythmValue, dynamic values, and pan values. 
                To show several values, create several histograms.  
              Colours are used to help identify particular values within the 
                histogram. In the pitch histogram, shown at the right, each c 
                pitch is red, each E is orange, and each G is blue. other notes 
                are in black - all chromatic pitches can be displayed. 
                 
                Similarly for rhythm and other displays, colours differentiate 
                elements in the graph at regular intervals.  
              To create a histogram from any jMusic 
                score use this code: 
              View.histogram(myScore); 
              Make sure to import the jm.util.View 
                class! 
              For more details and a full example 
                see the code and comments below. 
              Here is a link to the source file for 
                the example class. 
              HistogramTest.java  
              This test program creates one thousand 
                jMusic notes and displays the resulting score as a series of histograms, 
                like the one shown above.   | 
                
  | 
           
        
       
      
      Let's have a closer look. 
        
       
        
           
             import jm.music.data.*; import jm.JMC; import jm.util.View;   public class HistogramTest implements JMC {       public static void main(String[] args) {         Phrase phr = new Phrase();         for(int i=0; i<1000; ) {             Note n = new Note((int)(Math.random() * 127) ,                  (int)(Math.random() * 20) * 0.25,                  (int)(Math.random() * 127));             n.setPan(Math.random());             if (n.isScale(MAJOR_SCALE)) {                 phr.addNote(n);                 i++;             }         }         Score s = new Score (new Part(phr));                  View.histogram(s);                  View.histogram(s, RHYTHM, 40, 30);                  View.histogram(s, DYNAMIC, 80, 60);                  View.histogram(s, PAN, 120, 90);     } }  
             | 
           
        
       
      
      Inside the HistogramTest Java class. 
      This program first imports the JMC class to 
        allow access to the jMusic constants, also the jm.music.data package to 
        gain access to the Score, Part, Phrase and Note classes and, lastly, the 
        jm.util.View class which has a histogram method we wish to utilise. 
       
       
        
           
             import jm.music.data.*; import jm.JMC; import jm.util.View;   | 
           
        
       
      
      All details of this class are in one main() 
        method. The first section of this method creates a Score to be analysed. 
        It generates 1000 notes with random pitches, rhythmValues, dynamics and 
        pan values. To make the pitches a bit more interesting they are limited 
        to only be within the C major scale. 
       
       
        
           
                 public static void main(String[] args) {         Phrase phr = new Phrase();         for(int i=0; i<1000; ) {             Note n = new Note((int)(Math.random() * 127) ,                  (int)(Math.random() * 20) * 0.25,                  (int)(Math.random() * 127));             n.setPan(Math.random());             if (n.isScale(MAJOR_SCALE)) {                 phr.addNote(n);                 i++;             }         }         Score s = new Score (new Part(phr)); 
             | 
           
        
       
      
      To view the score as a histogram the View.histogram() method is called. 
        it is called several times to show the variety of histograms that can 
        be displyed. 
        Notice that the constructor which only takes a Score argument defaults 
        to showing a histogram of pitches.  
        The others add constructor arguments indicating that rhythm, dynamic or 
        pan values should be mapped. 
        Constant values from the JMC are used, they are always in UPPER case. 
         
        The final two arguments specify an x,y coordinate at which the the histogram 
        widow will appear. 
       
       
        
           
                     View.histogram(s);                  View.histogram(s, RHYTHM, 40, 30);                  View.histogram(s, DYNAMIC, 80, 60);                  View.histogram(s, PAN, 120, 90);  
             | 
           
        
       
      
      This code will generate four different histogram 
        windows. Give it a try, then add histogram generation to some of your 
        own jMusic classes. 
      Saving data 
      The data from the histogram analysis can be 
        saved as a tab-delimitered text file using the following code, after importing 
        the jm.gui.histogram.Histogram; class: 
             Histogram h = new Histogram(myScore);        h.saveData(); 
     |