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. |