There
is an interface of SoundCipher constants for all
the General MIDI sound bank instruments. These are
the instruments (sounds) that
are included with Java in the JavaSound soundbank.
The General MIDI standard specifies categories for
most orchestral and popular music instruments
including keyboards, guitars, basses, drums,
woodwinds, strings, brass, and so on. In many
cases you should be able to 'guess' the instrument
name and it will be available. But check the
SoundCipher documentation for the full list. As
with other SoundCipher constants the format for
specifying the instrument names is:
[soundcipher instance].[instrument name in upper
case]
for example:
sc.BASSOON
The following program is a demonstration of how to
use and change the instruments. It's way more
complicated than necessary (sorry) but hopefully
there are a number of other interesting aspects to
it as well, such as employing several SoundCipher
instances at once.
The program creates three parallel and somewhat
independent descending musical lines. It uses a
pentatonic scale (defined by another constant) to
keep all pitch material coherent. The descending
lines reset to the a higher pitch as required so
the descending process continues indefinitely. The
instruments can be changed while the program is
running by rolling over the graphical interface
with the mouse. This allows the user to choose
between two sets of instruments; a woodwind set
and the string set. Here's the code.
Some of the technical details will now be
described.
Arrays are used to contain values for each of
three parts. There are arrays for sets of
SoundCipher instances, pitches of each part, and
instruments that will be used.
The setup() method does the GUI interface work,
and sets a low frame rate that controls note
playback tempo.
The draw() method monitors mouse position and
triggers redraw, instrument change when required,
and sometimes plays the notes in each part.
The play() method is called by draw() and is
passed an argument for part 0, 1 or 2, a value
that is used to access values within the various
arrays. The play command ends with a check to see
if the current pitch is below a threshold and, if
so, resets it to a higher pitch so the descending
process restarts. Otherwise the pitch is
decremented each iteration.
That's it, for new stuff.
The modeQuantize() method is taken from the Scales
tutorial and rounds a pitch up to the nearest
scale (mode) degree. The scale or mode and
key is passed in as an argument and the
sc.PENTATONIC scale constant is used in this case
and the key is always C (indicated by value 0).
|