ShowChaos: Showing 
        phrases and parts as pseudo-notation 
      In an earlier demo we saw the simple DrawScore tool which displays a 
        jMusic score as a piano roll display.  
        Later we saw the ShowScore demo which introduced a jm music tool which 
        displays scores in a stave view.  
        The ShowScore tool is very similar, but displays the jMusic score on a 
        grand stave using the piano-roll-like note bars. 
      To remind you, here is what the Fractal melody looked like in the ShowScore 
        window. 
        The ShowPhrase and ShowPart classes will look identical except they will 
        display a phrase or a part passed to them, rather than the whole score. 
         
        This can be useful if you wish to examine sections of the score, or to 
        compare a particular phrase with another or with the whole score. 
            In 
        ShowScore, ShowPart, and ShowPhrase views notes are shown as rectangles 
        (their length proportional to their duration). 
        The black thin lines indicate treble and bass staves, while the grey staves 
        indicate pitches at more extreme parts of the range but can be 
        read as treble (upper) and bass (lower) two octaves away. The ruler displays 
        a line for each beat and larger lines in groups of four. 
      The horizontal scale of the score can be adjusted by dragging on the 
        ruler bar along the top of the window. 
      The ShowChaos class creates a score and displays sections of 
        it using ShowPrase, ShowPart, and ShowScore. 
      Click here to view source. 
      Lets have a closer look. 
      
        
           
              import jm.JMC; import jm.music.data.*; import jm.music.tools.*; import jm.util.*;
    | 
           
        
       
          As well as the by now familiar imports, note that the jm.music.tools.* 
        line is necessary because ShowPhrase, ShowPart, and ShowScore are in the 
        jMusic jm/music/tool directory. 
      
        
           
             public final class ShowChaos implements JMC{ 	public static void main(String[] args){ 	       	Score score = new Score("JMDemo - Show Chaos"); 	       	Part inst = new Part("Piano", PIANO, 0); 	       	Part inst2 = new Part("Guitar", GUITAR, 1); 	       	Part inst3 = new Part("Flute", FLUTE, 2); 	       	Phrase phr = new Phrase(0.0); 	         	        		for (double i=0.0;i<Math.random()*100;i+=Math.random()*2.0+8.0) { 	               	phr = makePhrase(i); 	               	inst.addPhrase(phr); 	       	} 	        	       	for (double i=0.0;i<Math.random()*100;i+=Math.random()*2.0+8.0) { 	               	phr = makePhrase(i); 	               	inst2.addPhrase(phr); 	       	} 	        	       	for (double i=0.0;i<Math.random()*100;i+=Math.random()*2.0+8.0) { 	               	phr = makePhrase(i); 	               	inst3.addPhrase(phr); 	       	} 	         	        		score.addPart(inst); 	       	score.addPart(inst2); 	       	score.addPart(inst3);               | 
           
        
       
      In section of the code the class is setup and most of the main() method 
      is shown. First the arguments (variables) for the class are setup.  
      There are three parts each on a different channel. The Phrase "phr" is declared 
      and will be used again and again to create numerous phrases later on.  
        The section 'Do Chaotic Things' creates notes for each part in turn. 
        It calls the makePhrase() method which we will see below to create a phrase. 
        The random bits effect the start time opf phrases (all the chaos theory 
        happens in the makePhrase() method). 
      Finally, in this section, the three parts are added to the score. This 
        should be familiar by now. 
      
        
           
             	        		View.show(phr); 	       	View.show(inst, 20, 20); 	       	View.show(inst2, 40, 40); 	       	View.show(inst3, 60, 60); 	       	View.show(score, 80, 80);               
             | 
           
        
       
      Now that the sections are created we can show them with the View class method 
      show(). 
      Because the Phrase phr was used over and over the final Phrase only is shown 
      (none of the others have distinct names so cannot be referenced).  
      Each part is shown in turn, with the window position being adjusted each 
      time (20,20 etc.) to create a layered window appearance. 
      The score is shown in the same way.    These calls to show a section 
        can be made anywhere in the code after the section has been created.  
        You do not have to wait for a Part to be added to a Score before showing 
        the Part, for example. 
      
        
           
                        	        		Write.midi(score, "Chaos.mid"); 	}                | 
           
        
       
      The last segment of the main() method exports the score as a MIDI file in 
      the usual fashion.       
        
           
                	public static Phrase makePhrase(double startTime) { 	       	double a = Math.random()* 2.0; 	       	double b = 0.3; 	       	double xold = 0.0;  			        		double x, y; 	        		double yold = 0.0;  			        		int pitch; 	       	Phrase phrase = new Phrase(startTime); 		for(short i=0;i<(int)Math.random()*10+15;i++){ 	               	x = 1 + yold - a * xold * xold; 	               	y = b * xold;	                			pitch = (int)(x*24)+60; 			 	               	if (pitch%12==1 | pitch%12==3 | pitch%12== 6 |  			    pitch%12==8 | pitch%12==10) pitch -= 1;  			 			 			if(pitch <0) pitch *=-1;
  	               	Note note = new Note(pitch, Q); 	               	phrase.addNote(note); 	               	xold = x; 	               	yold = y; 	       	} 	       	return phrase; 	} }              
             | 
           
        
       
      The second method in this class is 
      makePhrase(). 
      Notice that the method declaration (first line) is not void (like we have 
      mainly seen) but declares a return type of Phrase. 
      This indicates that the method will pass an object of type Phrase when it 
      is complete. 
      If you look at the last line of the method you can see the 'return Phrase' 
      command doing just that. 
      You might remember that this method was called in main() 
      when creating Phrases for each Part of the piece.    First 
        it sets up the variables to be used. The variable 'a' is randomised so 
        that each phrase is not the same. 
        It then does the Chaos math to generate notes, just as in the previous 
        Chaos examples.  
        The length of phrases is set randomly between 15 and 25 notes. The pitches 
        are scaled to between 60 and 84.  
        The pitches are checked to see if they are on 'black' notes, and if so 
        decremented by 1 to flatten them to 'white' notes. 
        In this way only notes in the C major scale are produced. 
      The final curly bracket closes the class. 
      Have a go at using the View.show() 
        method in your own jMusic classes.   |