fi.jyu.mit.Music
Class BufferedMidiPlayer2

java.lang.Object
  extended by fi.jyu.mit.Music.MidiPlayer
      extended by fi.jyu.mit.Music.BufferedMidiPlayer2
All Implemented Interfaces:
BasicMidiPlayer

public class BufferedMidiPlayer2
extends MidiPlayer
implements BasicMidiPlayer

Puskuroitu äänijärjestelmä, jonka tarkoitus on tukea mahdollisuutta syöttää äänijärjestelmälle nuotteja, jotka voidaan toistaa joko pääohjelman säikeessä tai uudessa säikeessä. Tälläin käskyt play ja playNote eivät toista saamiansa nuotteja heti, vaan ne puskuroidaan, eli varastoidaan. Soittaminen aloitetaan metodeilla run tai runAsync. Metodilla run äänijärjestelmä aloittaa soittamisen nykyisessä säikeessä, kun taas runAsync tekee uuden säikeen joka sitten pyörii niin kauan kunnes soitto on loppunut. Soittimessa on useita tarckejä (tai kanaviksikin voi ajatella), joihin voi "soittaa" eri soittimia. Trackin voi tahdistaa keskenään jos johonkin ei ole pitkän aikaan annettu nuotteja. Asynkronisen soittamisen voi aina lopettaa käskyllä stop.

Version:
12.9.2010 TODO: rinnakkain soivat nuotit esim syntaksilla A(FG)A voidaan tehdä esim. niin, että nuotti voi koostua nuoteista ja koostetun nuotin getLength palauttaa pisimmän sen sisällä olevan nuotin. Entä miten voidaan sanoa että ensin alkuun yksi nuotti ja ennen kuin se loppuu alkaa toinen ja ne soivat vähän aikaa yhtäaikaa? Pitäisikö sittenkin sanoa tyyliin: A(-F*+G*-)A eli ensin soitetaan A, sitten alkaa yhtäaikaisuus jossa toiseen taukoa, toisessa jo alkaa G, sitten toisessa F ja soittoa jää päällekkein yhden nuotin verran ja F soi yksin loppuun (G:n perässä olevaa taukoa ei tarvittaisi oikeastaan) ja sitten kun F loppuu, jatkuu pelkäällä A:lla. Tällöin pienen kirjoitettu yhtäaikaisuus olisi A(F+G)A TODO: miettivät onko tempo (bmp) otettu huomioon oikeassa paikassa, pitäisikö huomioida vasta soittohetkellä? TODO: saako nuotit poistaa soittamisessa? TODO: pitäisikö soittamisen ajaksi tehdä kopio trackeistä? TODO: ASCII-tiedoston soitti niin, että sieltä luetaan bpm, kanavien soittimet ja kullekin kanavalle tulevat nuotit, esim, syntaksilla 0: CCCA TODO: pitäisikö syntaksia laajentaa sen verran että voisi sanoa myös A*3/4 joka olisi nätimpi kuin A*0.75
Author:
vesal

Nested Class Summary
 
Nested classes/interfaces inherited from class fi.jyu.mit.Music.MidiPlayer
MidiPlayer.NoteDuration
 
Field Summary
 
Fields inherited from class fi.jyu.mit.Music.MidiPlayer
ALLNOTES, basicNotes, basicNotes2, channels, currentChannel, DEFOCTAVE, DEFVELOCITY, DELAYST, instruments, synth
 
Constructor Summary
BufferedMidiPlayer2()
           
BufferedMidiPlayer2(int channel)
           
 
Method Summary
 List<Note> getCopyOfNotes(int index)
          Luo kopion puskuroiduista nuoteista
 int getCurrentTime(int index)
          Palauttaa kavan nykyajanhetken kanavan alusta
 List<Note> getNotes(int index)
          Palauttaa nuotit viitteenä jolloin niiden muuttaminen muuttaa soitettavia nuotteja
 NoteTrack getTrack(int index)
          Palauttaa pyydetyn trackin.
 boolean isMuted(int index)
           
 void midiSoundNote(int note, int length, int velocity)
          Tallentaa nuotin puskuriin.
 void mute(int index, boolean muted)
          Vaimennetaan tietty track pois
 void play(int index, List<Note> notes)
          Soittaa nuotit
 void play(int index, String sequence)
           
 void play(int index, String sequence, double length)
           
 void play(int index, String sequence, double length, int octave)
           
 void play(int index, String sequence, double length, int octave, int velocity)
           
 void play(List<Note> notes)
          Soittaa nuotit 0-trackille
protected  void rest(int barLength)
          Toistaa mielivaltaisen tauon.
 void run()
          Ajaa kaikki trackit niin, että päääohjelmaan palataan vasta kun kaikki soitettu
 void runAsync()
          Aloittaa soiton rinnakkaisesti ja jatkaa kunnes se loppuu.
 void setInstrument(int instrument)
          Vaihtaa instrumentin.
 void setInstrument(int index, int instrument)
          Vaihtaa instrumentin.
 void setStartTime(int index, int startTime)
          Asettaa alkuajan.
 void stop()
          Pysäyttää asynkronisen soiton.
 void sync(int dest, int source)
          Toinen tapa saada kanavat samaan tahtiin.
 
Methods inherited from class fi.jyu.mit.Music.MidiPlayer
channelOff, channelOn, checkSynth, error, getBeatLength, getDefOctave, getInstrument, getInstrumentIndex, getNotes, getTempo, getVelocity, init, isVerbose, makeNote, makeNote, message, midiEndNote, midiStartNote, play, play, play, play, playAsciiFile, playMidiFile, playMidiFileAsync, playSingleNote, playSingleNote, playSingleNote, playSingleNote, printInstruments, printSequence, selectChannel, setDefOctave, setTempo, setVelocity, setVerbose
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface fi.jyu.mit.Music.BasicMidiPlayer
play, play, play, play, playSingleNote, playSingleNote, playSingleNote, playSingleNote, setTempo
 

Constructor Detail

BufferedMidiPlayer2

public BufferedMidiPlayer2()

BufferedMidiPlayer2

public BufferedMidiPlayer2(int channel)
Method Detail

getCopyOfNotes

public List<Note> getCopyOfNotes(int index)
Luo kopion puskuroiduista nuoteista

Parameters:
index - kopioitavan trackin numero
Returns:
kopio nuoteista

getNotes

public List<Note> getNotes(int index)
Palauttaa nuotit viitteenä jolloin niiden muuttaminen muuttaa soitettavia nuotteja

Parameters:
index - kopioitavan trackin numero
Returns:
nuotit

midiSoundNote

public void midiSoundNote(int note,
                          int length,
                          int velocity)
Tallentaa nuotin puskuriin.

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

rest

protected void rest(int barLength)
Description copied from class: MidiPlayer
Toistaa mielivaltaisen tauon.

Overrides:
rest in class MidiPlayer
Parameters:
barLength - tauon pituus ms

runAsync

public void runAsync()
Aloittaa soiton rinnakkaisesti ja jatkaa kunnes se loppuu. Soiton loputtua on kutsuttava stop(), muuten ohjelma jää käyntiin.


stop

public void stop()
Pysäyttää asynkronisen soiton.


run

public void run()
Ajaa kaikki trackit niin, että päääohjelmaan palataan vasta kun kaikki soitettu


setInstrument

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

Overrides:
setInstrument in class MidiPlayer
Parameters:
instrument - Instrumentti väliltä 1-128.

setInstrument

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

Overrides:
setInstrument in class MidiPlayer
Parameters:
index - track johon instrumentti vaihdetaan
instrument - Instrumentti väliltä 1-128.

getTrack

public NoteTrack getTrack(int index)
Palauttaa pyydetyn trackin. Jos ei ole, luodaan

Parameters:
index - mikä track halutaan
Returns:
uusi track tai indeksistä löytyvä track.

play

public void play(int index,
                 List<Note> notes)
Soittaa nuotit

Parameters:
index - track jolla soitetaan
notes - soitettavat nuotit

play

public void play(List<Note> notes)
Soittaa nuotit 0-trackille

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

play

public void play(int index,
                 String sequence,
                 double length,
                 int octave,
                 int velocity)
Parameters:
index - track jolla soitetaan
sequence - Nuotit
octave - Oktaavi
length - Yksittäisen nuotin kesto
velocity - voimakkuus, 64 on normaali

play

public void play(int index,
                 String sequence,
                 double length,
                 int octave)

play

public void play(int index,
                 String sequence,
                 double length)

play

public void play(int index,
                 String sequence)

mute

public void mute(int index,
                 boolean muted)
Vaimennetaan tietty track pois

Parameters:
index -
muted -

isMuted

public boolean isMuted(int index)
Parameters:
index - tutkittava track
Returns:
true jos vaimennettu, muuten false

getCurrentTime

public int getCurrentTime(int index)
Palauttaa kavan nykyajanhetken kanavan alusta

Parameters:
index - mikä kanava
Returns:
nykyajanhetki

setStartTime

public void setStartTime(int index,
                         int startTime)
Asettaa alkuajan. Voi käyttää esim jos toinen kavan on jo paljon soittanut ja halutaan aloittaa toinen nykykohdasta. esim: mp.setStartTime(1, mp.getCurrentTime(0));

Parameters:
index - minkä kanvan aloitusaika asetetaan
startTime - uusi aloitusaika

sync

public void sync(int dest,
                 int source)
Toinen tapa saada kanavat samaan tahtiin. Lisää tauon, jolla päästään samaan kohtaan. Lisätään taukjo siihen kanavaan, jossa on vähemmän aikaa.

Parameters:
dest - mikä kanava synkronoidaan
source - mihin kanavaan