Polyphonic 
        Random Patterns
      This demo extends the Random Patterns demo in creating polyphonic random 
        patterns.  
        It is essentially the same process repeated three times using three different 
        percussion voices.  
        However, a number of interesting structural programming changes in the 
        class are worth noting. 
      To hear the result play this MIDI file  
      Click here to view source. 
      Lets have a closer look. 
      
        
           
             import jm.JMC; import jm.music.data.*; import jm.midi.*; import jm.util.*;
    | 
           
        
       
         
      Lines 1-4 import useful packages that we need to use in the program. 
         
        The first import statement gets a standard Java class. 
        The rest of the statements import the jMusic classes required by this 
        class. 
      
        
           
             public final class PolyPatterns implements JMC{
  	static double[] pattern = new double[5]; 	static double[] pattern0 = {1.0, 0.5, 0.5, 1.5, 0.5};         static double[] pattern1 = {0.5, 0.5, 1.5, 0.5, 1.0};         static double[] pattern2 = {2.0, 0.5, 0.5, 0.5, 0.5};         static double[] pattern3 = {1.5, 0.5, 1.0, 0.5, 0.5};                	public static void main(String[] args){         	Score Score = new Score("JMDemo - Polyphonic Rhythm Patterns");                 Part inst = new Part("Drums", 0, 9);                 Phrase phr = new Phrase(0.0);                 Phrase phr2 = new Phrase(0.25);                 Phrase phr3 = new Phrase(0.5);          
             | 
           
        
       
         
      In this section Score, Part, and Phrase objects are created. As well, 
        arrays of duration are set up, each one 4 beats long.  
        The array called 'pattern' is later used to store one of the randomly 
        selected patterns 0 through 3 
        . A phrase is created for each of the three percussion voices.  
        Notice that the start times for each phrase is offset by a sixteenth note 
        (semiquaver) to add musical interest and excitement. 
      
        
           
                        for(short i=0;i<8;i++){                 setPattern();                          for (short j=0; j<pattern.length; j++) {                 	Note note = new Note((int)(38), pattern[j]);                         phr.addNote(note);                 }                 setPattern();                                for (short j=0; j<pattern.length; j++) {                 	Note note = new Note((int)(42), pattern[j]);                         phr2.addNote(note);                 }                                    setPattern();                                for (short j=0; j<pattern.length; j++) { 			Note note = new Note((int)(39), pattern[j]);                 	phr3.addNote(note);                 }            }          | 
           
        
       
         
      Here one of the four patterns is randomly selected eight times over. 
        Each time through the snare, hi hat, and clap patterns are added to their 
        respective phrases. 
        Notice that a new random pattern is selected before each part is rendered 
        using the 'setPattern()' method - see below. 
        The percussive sounds (clap etc.) are selected by choosing the appropriate 
        pitch (39 for clap, and so on). 
      
        
           
             		Note note = new Note((int)(49), 4.0); 		phr.addNote(note);
    | 
           
        
       
          Just for musical coherence a cymbal crash is added 
        to the end of the phrase, otherwise the score does not finish on a down 
        beat. 
      
        
           
             	inst.addPhrase(phr);                 inst.addPhrase(phr2);                 inst.addPhrase(phr3);                 score.addPart(inst);                                 System.out.println(score.toString());         
             | 
           
        
       
         
      Each phrase is added to the same Part and the part to a Score. 
        The score is printed to the screen when the class file is run.  
        This allows the user to see the score data and to enable error checking. 
      
        
           
                    Write.midi(score, "PolyPatterns.mid");     }          | 
           
        
       
         
      As with other jMusic tutorial files, this code creates a MIDI file from 
        the score. 
        Once created the polyPatterns.mid file can be played by any MIDI file 
        player and will sound correctly using a General MIDI sound source, 
        such as most PC sound cards, or Quicktime. The final line provides feedback 
        during execution that the MIDI file has been successfully written. 
      
        
           
             public static void setPattern() {         	int x = (int)(Math.random()*4);                      	switch (x) {                          		case 0:                 	     	pattern = pattern0;                 		break;               	 			case 1:                 	     	pattern = pattern1;                 		break;               	 			case 2:                 	     	pattern = pattern2;                 		break;               	 			case 3:                 	     	pattern = pattern3;                 		break;               	 			default:                 	    	System.out.println("Switch out of range");                		    	System.exit(0);  		} 	}         | 
           
        
       
         
      This class contains a second method which chooses one of the patterns 
        at random. 
        It is efficient to isolate this routine as a separate method because it 
        is called many times during the program execution and would otherwise 
        need to be repeated within the main method.  
        The pattern arrays are declared earlier as class variables to allow access 
        from both the main and setPattern methods.      |