import promidi.*; import processing.xml.*; int number = 15; int waveform = 0; String filename; promidi.Sequencer sequencer; promidi.Track track; XMLElement xml; void setup() { size(400, 150); background(0, 204, 255); textFont(loadFont("Calibri-Bold-18.vlw")); fill(0); text("Click to start.", 12, 30); } void mousePressed() { String wvf; if (waveform == 0) { wvf = "Sine"; } else if (waveform == 1) { wvf = "Saw"; } else { wvf = "Piano"; number = (number + 1) % 17; } filename = (number < 10 ? "0" : "") + number + "-" + wvf + "_0.wav-081003-1337.out"; waveform = (waveform + 1) % 3; filename = "04.xml"; playXML(filename); } void playXML(String xmlFile) { println("Playing " + xmlFile); background(0, 204, 255); textFont(loadFont("Calibri-Bold-18.vlw")); fill(0); text("Playing back XML file...", 12, 30); fill(0, 80); text(filename, 12, 60); // For MIDI playback sequencer = new promidi.Sequencer(); MidiIO midiIO = MidiIO.getInstance(); MidiOut midiOut = midiIO.getMidiOut(1,1); if (waveform == 1) { midiOut.sendProgramChange(new ProgramChange(81)); } else if (waveform == 0) { midiOut.sendProgramChange(new ProgramChange(78)); } else { midiOut.sendProgramChange(new ProgramChange(0)); } track = new promidi.Track("TrackOne", midiOut); // Read in the XML xml = new XMLElement(this, filename); String windowSize = xml.getChild("header/windowSize").getContent(); String samplingRate = xml.getChild("header/samplingRate").getContent(); //int windowTicks = Integer.parseInt(windowSize) / 250; int windowLength = round((1.0 / Float.parseFloat(samplingRate)) * (Integer.parseInt(windowSize) + 1.0) * 100); XMLElement[] notes = xml.getChildren("note"); // Add the notes to the track String temp; int start; int end; int pitch; int len; for (int i = 0; i < notes.length; i++) { temp = notes[i].getChild("start").getContent(); start = Integer.parseInt(temp) + 1; temp = notes[i].getChild("end").getContent(); end = Integer.parseInt(temp) + 1; //len = (end - start) * windowLength; pitch = pitchToInt(notes[i].getChild("pitch").getContent()); track.addEvent(new Note(pitch, 127, 0), start * windowLength); track.addEvent(new Note(pitch, 0, 0), end * windowLength); } // Prepare it for playback promidi.Song song = new Song("Song", 120); song.addTrack(track); sequencer.setSong(song); sequencer.start(); } void draw() { } int pitchToInt(String pitch) { int toReturn = 9; char temp = pitch.charAt(0); switch (temp) { case 'c': case 'C': toReturn += 4; break; case 'd': case 'D': toReturn += 6; break; case 'e': case 'E': toReturn += 8; break; case 'f': case 'F': toReturn += 9; break; case 'g': case 'G': toReturn += 11; break; case 'a': case 'A': toReturn += 13; break; case 'b': case 'B': toReturn += 15; break; } temp = pitch.charAt(1); if (temp == '#') toReturn++; int octave = Integer.parseInt(pitch.substring(2, 3)); toReturn += (octave+1) * 12; toReturn--; return toReturn; }