fi.jyu.mit.Music
Class MidiPlayer

java.lang.Object
  extended by fi.jyu.mit.Music.MidiPlayer
All Implemented Interfaces:
BasicMidiPlayer
Direct Known Subclasses:
BufferedMidiPlayer, BufferedMidiPlayer2, ThreadedMidiPlayer

public class MidiPlayer
extends Object
implements BasicMidiPlayer

MidiPlayer-luokka sisältää varsinaisen äänijärjestelmän yksinkertaisen MIDI-datan toistoa varten. äänijärjestelmä kykenee soittamaan yhdellä instrumentilla nuoteista koostuvaa soittoa. Kaikki GM-1 standardin tukemat instrumentit ovat käytässä. Standardin määritykset läytyvät spesifikaatiosta. Oktaavi, ks: esim: http://fi.wikipedia.org/wiki/Oktaavi

See Also:
BufferedMidiPlayer

Nested Class Summary
static class MidiPlayer.NoteDuration
          Nuotin kestot tahdin desimaaliosissa.
 
Field Summary
static String[] ALLNOTES
          Lista nuoteista.
static String basicNotes
           
static String basicNotes2
           
protected  MidiChannel[] channels
          Taulukko midikanavia varten.
protected  int currentChannel
          Nykyinen käytässä oleva kanava.
static int DEFOCTAVE
           
static int DEFVELOCITY
           
static String DELAYST
           
protected  Instrument[] instruments
          Taulukko instrumentteja varten.
protected  Synthesizer synth
          Syntetisaattori.
 
Constructor Summary
MidiPlayer()
          Muodostaa äänijärjestelmän.
MidiPlayer(boolean init)
          Muodostaa äänijärjestelmän, kuitenkaan syntetisaattoria alustamatta.
 
Method Summary
protected  void channelOff(int note)
          Sulkee kanavalta nuotin.
protected  void channelOn(int note, int velocity)
          Avaa kanavalta nuotin.
protected  void checkSynth(String origin)
          Tulostaa virheviestin.
protected  void error(String msg)
          Tulostaa virheviestin ja lopettaa ohjelman.
protected  int getBeatLength()
           
 int getDefOctave()
           
 int getInstrument()
           
 int getInstrumentIndex(String regexp)
          Etsii ensimmäisen instrumentin jonka nimi täsmää hakuehtoon
 List<Note> getNotes(String sequence, double length, int defaultOctave, int velocity)
          Jäsentää merkkijonon nuotit & tauot yksittäisiksi nuotteiksi.
 int getTempo()
           
 int getVelocity()
           
 void init()
          Alustaa MIDI-syntetisaattorin.
 boolean isVerbose()
           
 Note makeNote(String note, double length, int octave)
          Muuntaa nuotin, oktaavin ja voimakkuuden Note-luokan alkioksi.
 Note makeNote(String note, double length, int octave, int velocity)
          Muuntaa nuotin, oktaavin ja voimakkuuden Note-luokan alkioksi.
protected  void message(String msg)
          Tulostaa viestin mikäli viestintulostus on päällä.
 void midiEndNote(int note, int length, int velocity)
          Aloittaa kanavalta MIDI-nuotin (21-108).
 void midiSoundNote(int note, int length, int velocity)
          Soittaa kanavalta MIDI-nuotin (21-108).
 void midiStartNote(int note, int length, int velocity)
          Aloittaa kanavalta MIDI-nuotin (21-108).
 void play(List<Note> notes)
          Soittaa nuotit nuottien listasta
 void play(String sequence)
          Toistaa nuotteja.
 void play(String sequence, double length)
          Toistaa nuotteja tietyssä oktaavissa neljäsosanuotteina.
 void play(String sequence, double length, int octave)
           
 void play(String sequence, double length, int octave, int velocity)
          Toistaa merkkijonon neljäsosanuotteja perusoktaavissa (4), esim.
 void playAsciiFile(String filename)
          Toistaa ASCII-tiedoston.
 void playMidiFile(String filename)
          Soittaa valitun midi-tiedoston ja odottaa soiton loppumista.
 Sequencer playMidiFileAsync(String filename)
          Toistaa MIDI-tiedoston niin että ohjelma vi jatkaa muita tehtäviä.
 void playSingleNote(String note)
          Toistaa neljäsosanuotin neljännessä oktaavissa.
 void playSingleNote(String note, double length)
          Toistaa nuotin neljännessä oktaavissa.
 void playSingleNote(String note, double length, int octave)
          Toistaa minkä tahansa kestoisen nuotin tietyssä oktaavissa.
 void playSingleNote(String note, double length, int octave, int velocity)
          Toistaa minkä tahansa kestoisen nuotin tietyssä oktaavissa.
 void printInstruments()
          Tulostaa kaikkien instrumenttien nimet
 void printSequence(Sequence song)
           
protected  void rest(int barLength)
          Toistaa mielivaltaisen tauon.
 void selectChannel(int channel)
          Valitsee kanavan.
 void setDefOctave(int defocatve)
           
 void setInstrument(int instrument)
          Vaihtaa instrumentin.
 void setInstrument(int instrument, int def)
          Vaihtaa instrumentin.
 void setTempo(int bpm)
          Asettaa tempon.
 void setVelocity(int velocity)
          Asetetaan nopeus jolla "kosketinta lyödään"
 void setVerbose(boolean set)
          Debug-viestit päälle/pois
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFVELOCITY

public static final int DEFVELOCITY
See Also:
Constant Field Values

DEFOCTAVE

public static final int DEFOCTAVE
See Also:
Constant Field Values

DELAYST

public static final String DELAYST
See Also:
Constant Field Values

ALLNOTES

public static final String[] ALLNOTES
Lista nuoteista.


basicNotes

public static final String basicNotes
See Also:
Constant Field Values

basicNotes2

public static final String basicNotes2
See Also:
Constant Field Values

channels

protected MidiChannel[] channels
Taulukko midikanavia varten.


currentChannel

protected int currentChannel
Nykyinen käytässä oleva kanava. Oletuksena 0.


instruments

protected Instrument[] instruments
Taulukko instrumentteja varten.


synth

protected Synthesizer synth
Syntetisaattori.

Constructor Detail

MidiPlayer

public MidiPlayer()
Muodostaa äänijärjestelmän. Alustaa syntetisaattorin ym.


MidiPlayer

public MidiPlayer(boolean init)
Muodostaa äänijärjestelmän, kuitenkaan syntetisaattoria alustamatta. Tämä tarpeen jos ei halua viedä syntesaattoria järjestelmällä joissa niitä on vain yksi.

Parameters:
init - Alustustehto. Jos true, niin syntetisaattori käynnistetään, jos false, niin ei.
Method Detail

getDefOctave

public int getDefOctave()

setDefOctave

public void setDefOctave(int defocatve)

getNotes

public final List<Note> getNotes(String sequence,
                                 double length,
                                 int defaultOctave,
                                 int velocity)
Jäsentää merkkijonon nuotit & tauot yksittäisiksi nuotteiksi. Jonossa saa olla ylmääräisiä välilyäntejä tai | merkkejä selkeyttämässä jakoa ilman että ne sotkevat mitään. Esimerkkjä käytöstä ks alla olevat testit.

Parameters:
sequence - Merkkijono nuoteista, esim. C#5
defaultOctave - Oletusoktaavi, jossa nuotit soitetaan, jos niille ei annettu oktaavia
length - Yksittäisen nuotin pituus jos nuotille ei erikeen ole annettu pituutta
velocity - voimakkuus, 64 on perus
Returns:
Example:
 #import java.util.*;
   MidiPlayer mp = new MidiPlayer(); List notes;
   
   notes = mp.getNotes("-b -/4 -#*",0.25,4,64); // - = tauko, ylennys tai alennus ei haittaa 
   notes.get(0).isDelay()   === true;
   notes.get(1).isDelay()   === true;
   notes.get(2).isDelay()   === true;
   notes.get(0).getLength() === 500;
   notes.get(1).getLength() === 125;
   notes.get(2).getLength() === 1000;
   
   notes = mp.getNotes("C/E/4D*F*4A.F*1.2",0.25,4,64); //  /nro jakaa pituuden, *nro kertoo
   notes.get(0).isDelay()   === false;      
   notes.get(0).getLength() === 250;                   // / yksin on sama kuin /2
   notes.get(1).getLength() === 125;                   // /4 jakaa pituuden 4:llä
   notes.get(2).getLength() === 1000;                  // *  yksin on sama kuin *2
   notes.get(3).getLength() === 2000;                  // *4 kertoo pituuden 4:llä
   notes.get(4).getLength() ~~~ 500*1.5;               // kerrotaan pituus 1.5:lla
   notes.get(5).getLength() ~~~ 500*1.2;               // ja 1.2lla

   notes = mp.getNotes("C C# D D# E F F# G G# A Bb B",0.25,4,64); // oktaavin kaikki nuotit
   for (int i=0; i<12; i++) {
     notes.get(i).getNote() === 60 + i;
   }
      
   notes = mp.getNotes("c c# d d# e f f# g g# a Bb B",0.25,4,64); // samat pienillä (paitsi B)
   for (int i=0; i<12; i++) {
     notes.get(i).getNote() === 60 + i;
   }
      
   notes = mp.getNotes("C Db D Eb E F Gb | G Ab A A# B",0.25,4,64); // ylennetään "eritavalla"
   for (int i=0; i<12; i++) {
     notes.get(i).getNote() === 60 + i;
   }   
   
   notes = mp.getNotes("HBhbBb",0.25,4,64);                         // H ja B ovat synonyymejä
   notes.get(0).getNote() === notes.get(1).getNote()
   notes.get(2).getNote() === notes.get(3).getNote()
     
   notes = mp.getNotes("C1C2C3C4C5C6C7C8",0.25,4,64); // kokeillaan C:tä eri oktaaveista
   notes.get(0).getNote() === 60 - 3*12  
   notes.get(1).getNote() === 60 - 2*12  
   notes.get(2).getNote() === 60 - 1*12  
   notes.get(3).getNote() === 60 - 0*12  
   notes.get(4).getNote() === 60 + 1*12  
   notes.get(5).getNote() === 60 + 2*12  
   notes.get(6).getNote() === 60 + 3*12  
   notes.get(7).getNote() === 60 + 4*12
     
   notes = mp.getNotes("E# F H# C5",0.25,4,64);          
   notes.get(0).getNote() === notes.get(1).getNote()  
   notes.get(2).getNote() === notes.get(3).getNote()
     
   notes = mp.getNotes("A#3* Hb3*",0.25,4,64);      // Ylennetty A on sama kuin alennettu H molemmat 2*
   notes.get(0).getNote() === notes.get(1).getNote()  
   notes.get(0).getLength() === notes.get(1).getLength()  
 

init

public void init()
Alustaa MIDI-syntetisaattorin.

Throws:
MidiUnavailableException
InvalidMidiDataException

makeNote

public final Note makeNote(String note,
                           double length,
                           int octave,
                           int velocity)
Muuntaa nuotin, oktaavin ja voimakkuuden Note-luokan alkioksi. Huom.! Nuotin perään ei tule oktaavia. Tauko on - -merkki.

Parameters:
note - Nuotti tekstimuodossa, esim. C# tai Bb
length - Nuotin pituus tahdin kokonaisosina
octave - Oktaavi (0-8)
velocity - voimakkuus, 64 on normaali
Returns:
Muunnettu nuotti.
See Also:
Note
Example:
   MidiPlayer mp = new MidiPlayer();
   Note note;
   
   note = mp.makeNote("C",0.5,4,64);
   note.getLength() === 1000;
   note.getNote() === 60;
   
   note = mp.makeNote("C#",0.5,4,64); // korotus
   note.getNote() === 61;
   
   note = mp.makeNote("H#",0.5,4,64); // korotettu H on seuraava C
   note.getNote() === 72;
   
   note = mp.makeNote("Bb",0.5,4,64); // Alennettu B (H)
   note.getNote() === 70;
   
   note = mp.makeNote("-",0.5,4,64); // Tauko
   note.isDelay() === true;
   
   note = mp.makeNote("-#",0.5,4,64); // Tauko, ylennys ei haittaa
   note.isDelay() === true;
   
   note = mp.makeNote("-b",0.5,4,64); // Tauko, alennus ei haittaa
   note.isDelay() === true;
 

makeNote

public final Note makeNote(String note,
                           double length,
                           int octave)
Muuntaa nuotin, oktaavin ja voimakkuuden Note-luokan alkioksi. Huom.! Nuotin perään ei tule oktaavia.

Parameters:
note - Nuotti tekstimuodossa, esim. "C#"
length - Nuotin pituus tahdin kokonaisosina
octave - Oktaavi (0-8)
Returns:
muutettu nuotti

midiSoundNote

public void midiSoundNote(int note,
                          int length,
                          int velocity)
Soittaa kanavalta MIDI-nuotin (21-108).

Parameters:
note - Nuotti (21-108)
length - Kesto millisekunteina
velocity - Nuotin nk. painovoimakkuus. Oletus on 64.

midiStartNote

public void midiStartNote(int note,
                          int length,
                          int velocity)
Aloittaa kanavalta MIDI-nuotin (21-108).

Parameters:
note - Nuotti (21-108)
length - Kesto millisekunteina
velocity - Nuotin nk. painovoimakkuus. Oletus on 64.

midiEndNote

public void midiEndNote(int note,
                        int length,
                        int velocity)
Aloittaa kanavalta MIDI-nuotin (21-108).

Parameters:
note - Nuotti (21-108)
length - Kesto millisekunteina
velocity - Nuotin nk. painovoimakkuus. Oletus on 64.

play

public void play(String sequence)
Toistaa nuotteja. Nuottien kesto oletetaan neljäsosanuoteiksi.

Specified by:
play in interface BasicMidiPlayer
Parameters:
sequence - Nuotit

play

public void play(String sequence,
                 double length)
Toistaa nuotteja tietyssä oktaavissa neljäsosanuotteina.

Specified by:
play in interface BasicMidiPlayer
Parameters:
sequence - Nuotit
octave - Oktaavi

play

public void play(String sequence,
                 double length,
                 int octave,
                 int velocity)
Toistaa merkkijonon neljäsosanuotteja perusoktaavissa (4), esim. "C5CC5CBbAA#". Huomaa, että "Bb" on aina annettava sellaisenaan, sillä parseri ei osaa erottaa onko kyseessä "bb" vai "BB", parseri olettaa että tuolloin on kaksi B-nuottia. Syntaksi yksittäiselle nuotille on seuraava: ABCD, jossa Mikä tahansa osista B, C tai D voi puuttua.
  Esim:
    C#A   on ylennetty C ja A, oktaavista 4, kesto perusnuotin verran (yleensä siis 1/4 nuotti)
    C5    C 5:stä oktaavista
    C*2   on perusnuottia 2 pidempi nuotti (yleensä siis puolinuotti)
    C/4   C jonka kesto on 1/4 perusnuotista (siis 1/16 nuotti yleensä)
    A/    A jonka kesto on puoleta perusnuotista (yleensä siis 1/8 nuotti)
    C#5*4 4 kertaa normaali pidempi ylennetty C 5. oktaavista    
    D.    1.5 kertaa normaalia pidempi D, eli sama kuin D*1.5
 

Specified by:
play in interface BasicMidiPlayer
Parameters:
sequence - Nuotit merkkijonona, jonossa olevat välilyönnit ja | eivät haittaa kunhan niitä ei laiteta nuotin sisälle
octave - Oletusoktaavi. Jos nuotille ei ole omaa oktaavia, käytettään tätä
length - Yksittäisen nuotin kesto, tähän suhteutetaan muut jonon nuotit
velocity - voimakkuus, 64 on normaali

play

public void play(String sequence,
                 double length,
                 int octave)
Specified by:
play in interface BasicMidiPlayer

play

public void play(List<Note> notes)
Soittaa nuotit nuottien listasta

Specified by:
play in interface BasicMidiPlayer
Parameters:
notes - soitettavat nuotit

playAsciiFile

public void playAsciiFile(String filename)
Toistaa ASCII-tiedoston.

Parameters:
filename -

playMidiFileAsync

public Sequencer playMidiFileAsync(String filename)
Toistaa MIDI-tiedoston niin että ohjelma vi jatkaa muita tehtäviä. Tälläin palautettu sequencer pitä ottaa vastaan ja sanoa sille joskus close.

Parameters:
filename - Tiedoston nimi, oltava midi-tiedosto
Returns:
seuencer jolla soitetaan, niin voi pysäyttää milloin haluaa

playMidiFile

public void playMidiFile(String filename)
Soittaa valitun midi-tiedoston ja odottaa soiton loppumista.

Parameters:
filename -

printSequence

public void printSequence(Sequence song)

playSingleNote

public void playSingleNote(String note)
Toistaa neljäsosanuotin neljännessä oktaavissa.

Specified by:
playSingleNote in interface BasicMidiPlayer
Parameters:
note - Nuotti (C-B)
Throws:
InvalidMidiDataException

playSingleNote

public void playSingleNote(String note,
                           double length)
Toistaa nuotin neljännessä oktaavissa.

Specified by:
playSingleNote in interface BasicMidiPlayer
Parameters:
note - Nuotti
octave - Oktaavi
Throws:
InvalidMidiDataException

playSingleNote

public void playSingleNote(String note,
                           double length,
                           int octave)
Toistaa minkä tahansa kestoisen nuotin tietyssä oktaavissa.

Specified by:
playSingleNote in interface BasicMidiPlayer
Parameters:
note - Nuotti
length - Kesto
octave - Oktaavi
Throws:
InvalidMidiDataException

playSingleNote

public void playSingleNote(String note,
                           double length,
                           int octave,
                           int velocity)
Toistaa minkä tahansa kestoisen nuotin tietyssä oktaavissa.

Specified by:
playSingleNote in interface BasicMidiPlayer
Parameters:
note - Nuotti
length - Kesto
octave - Oktaavi
velocity - voimakkuus
Throws:
InvalidMidiDataException

rest

protected void rest(int barLength)
Toistaa mielivaltaisen tauon.

Parameters:
barLength - tauon pituus ms

selectChannel

public void selectChannel(int channel)
Valitsee kanavan. Kanavia on MIDI-spesifikaatiossa 16.

Parameters:
channel - Kanava väliltä 1-16.

setInstrument

public void setInstrument(int instrument)
Vaihtaa instrumentin. Ks. spesifikaatio.

Parameters:
instrument - Instrumentti väliltä 1-128.

getInstrument

public int getInstrument()
Returns:
nykyinen instrumentti

setInstrument

public void setInstrument(int instrument,
                          int def)
Vaihtaa instrumentin. Ks. spesifikaatio.

Parameters:
instrument - Instrumentti väliltä 1-128.
def - Oletusarvo mitä käytetään jos annettu indeksi on väärin

setTempo

public void setTempo(int bpm)
Asettaa tempon. BPM on iskuja minuutissa, oletus on 120. Tämä määrää syntetisaattorin tempon.

Specified by:
setTempo in interface BasicMidiPlayer
Parameters:
bpm -

getTempo

public int getTempo()
Returns:
nykyinen tempo bmp

setVelocity

public void setVelocity(int velocity)
Asetetaan nopeus jolla "kosketinta lyödään"

Parameters:
velocity - lyöntinopeus, 64 on normaali

getVelocity

public int getVelocity()
Returns:
nopeus jolla kosketinta lyödään

setVerbose

public void setVerbose(boolean set)
Debug-viestit päälle/pois


channelOff

protected void channelOff(int note)
Sulkee kanavalta nuotin.

Parameters:
note - nuotti
velocity - voimakkuus

channelOn

protected void channelOn(int note,
                         int velocity)
Avaa kanavalta nuotin.

Parameters:
note - nuotti
velocity - voimakkuus

checkSynth

protected void checkSynth(String origin)
Tulostaa virheviestin. Tähän tarkoitukseen olisi sopinut kutsuvan metodin nimen onkiminen pinosta, mutta se on hidasta.

Parameters:
origin - Kutsuva metodi

error

protected void error(String msg)
Tulostaa virheviestin ja lopettaa ohjelman.

Parameters:
msg - Viesti

getBeatLength

protected final int getBeatLength()

message

protected void message(String msg)
Tulostaa viestin mikäli viestintulostus on päällä. Oletus on, että järjestelmä on hiljaa.

Parameters:
msg - Viesti

printInstruments

public void printInstruments()
Tulostaa kaikkien instrumenttien nimet


getInstrumentIndex

public int getInstrumentIndex(String regexp)
Etsii ensimmäisen instrumentin jonka nimi täsmää hakuehtoon

Parameters:
regexp -
Returns:
sen isntrumentin indkesi, joka täsmää hakuehtoon, -1 = ei löydy

isVerbose

public boolean isVerbose()
Returns:
onko aputulosteet päällä vai ei