package at.tugraz.ist.musicdroid;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
public class MidiPlayer {
private DrawTonesView toneView;
static final int SEMIQUAVER = 4;
static final int QUAVER = 8;
static final int CROTCHET = 16;
static final int MINIM = 32;
static final int SEMIBREVE = 64;
private String pathToMidi;
private Context context;
private MediaPlayer mediaPlayer;
public MidiPlayer(DrawTonesView tone, Context cxt){
toneView = tone;
context = cxt;
}
public String createMidifile(){
File directory;
File playFile;
String path;
directory = new File(Environment.getExternalStorageDirectory()+File.separator+"records"+File.separator+"Musicfiles");
if (!directory.exists()){
directory.mkdir();
}
path = directory.getAbsolutePath() + File.separator + "play.mid";
playFile = new File(path);
if(playFile.exists()){
playFile.delete();
}
pathToMidi = path;
return path;
}
public void writeToMidiFile(){
MidiFile midiFile = new MidiFile();
int numberOfTones = toneView.getTonesSize();
List<Tone> tonesArray = toneView.getTonesList();
String path = createMidifile();
for(int counter= 0; counter < numberOfTones; counter++){
Tone chordtones = (Tone) tonesArray.get(counter);
ArrayList<Integer> midiValues = chordtones.getMidiValues();
for(int innerCounterNoteOn = 0; innerCounterNoteOn < midiValues.size(); innerCounterNoteOn++){
midiFile.noteOn (0, midiValues.get(innerCounterNoteOn), 127);
}
for(int innerCounterNoteOff = 0; innerCounterNoteOff < midiValues.size(); innerCounterNoteOff++){
if (midiValues.size()>1){
if (innerCounterNoteOff==0){
midiFile.noteOff (CROTCHET, midiValues.get(innerCounterNoteOff));
}
midiFile.noteOff (0, midiValues.get(innerCounterNoteOff));
} else {
midiFile.noteOff (CROTCHET, midiValues.get(innerCounterNoteOff));
}
}
}
try {
File midi_File = new File (path);
if(midi_File.exists()){
midi_File.delete();
}
midiFile.writeToFile(path);
} catch (IOException e) {
Log.e("MidiPlayer", e.getMessage());
e.printStackTrace();
}
}
public void playMidiFile(){
File file = new File(pathToMidi );
if(!file.exists()){
Log.e("MidiPlayer", "Midi File does not exist!");
return;
}
Uri myUri = Uri.fromFile(file);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(context, myUri);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mediaPlayer.start();
}
public void stopMidiPlayer(){
mediaPlayer.stop();
}
public void releaseMidiPlayer(){
mediaPlayer.release();
}
}