Random Patterns 
      
      Because totally random durations make little musical sense to us, this 
        demo adds some certainty of pulse to an uncertain rhythmic outcome. 
        It does this by choosing randomly from a number of four beat rhythms. 
         
        Because each pattern is itself musically coherent, the result is guaranteed 
        to be reasonable even if highly unpredictable. 
         It is a recombinatorial algorithm, similar to Mozart's Dice Game. 
      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. 
      
        
           
             public final class RandomPatterns implements JMC{ 	public static void main(String[] args){         	Score score = new Score("JMDemo - Random Rhythm");         	Part inst = new Part("Snare", 0, 9);         	Phrase phr = new Phrase(0.0);         	int x;         	double[] pattern = new double[5];         	double[] pattern0 = {1.0, 0.5, 0.5, 1.5, 0.5};         	double[] pattern1 = {0.5, 0.5, 1.5, 0.5, 1.0}; 	double[] pattern2 = {2.0, 0.5, 0.5, 0.5, 0.5};         	double[] pattern3 = {1.5, 0.5, 1.0, 0.5, 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. 
      
        
           
                            for(short i=0;i<8;i++){                          			x = (int)(Math.random()*4);                         System.out.println("x = " + x);                                          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("Random number out of range");                         }              
             | 
           
        
       
         
      Here one of the four patterns is randomly selected eight times over. 
        Each time the code below is executed before the next pattern is chosen. 
        The switch statement is used with the random number 'x' to select a different 
        outcome in each possible random case. 
      The case statement consistes of a switch value, in this example the number 
        x, and cases for all possible values of the switch value. case 0, case 
        1, case 2, etc. This is used in this tutorial code to choose a pattern 
        array depending on a random number allocated to x. 
        The default case is used if all others fail - it is good programming practice 
        to use a default case even if (as in this example) it is considered impossible 
        that the default statement would be required. 
      
        
           
             		for (short j=0; j<pattern.length; j++) {                  	Note note = new Note((int)(38), pattern[j]);                        	phr.addNote(note);                 }              
             | 
           
        
       
          Each time a pattern is selected, each rhythmic value 
        in the pattern array is converted into a note on MIDI channel 10 (9 with 
        Java's zero offset) and added to the phrase. 
      
        
           
                 		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);             	score.addPart(inst);               
             | 
           
        
       
          The phrase is added to a Part and the part to a 
        Score. 
      
        
           
                 		Write.midi(score, "RandomPatterns.mid");                | 
           
        
       
          
      As with other jMusic demo files, this code creates a MIDI file from the 
        score. Once created the randomPatterns.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.  |