/** * @param piece a loaded GP4 file * @return a representation of the piece that supports the Song interface * @throws GP4AdaptorException */ public static Song makeSong(GPSong piece) throws GPFormatException { String methodName = "makeSong"; logger.entering(className, methodName); int bpm = piece.getTempo(); logger.finer("Tempo: " + bpm + "BPM"); Tempo tempo = new Tempo(); tempo.setBPM(bpm); Song song = new SongImpl(PPQ_HIGH_RESOLUTION / PPQ_SCALE_FACTOR, tempo); List<GPMeasure> measures = piece.getMeasures(); logger.finer("Number of measures: " + measures.size()); List<GPTrack> tracks = piece.getTracks(); logger.finer("Number of tracks: " + tracks.size()); // List fretStates = new LinkedList(); int index = 1; for (Iterator<GPTrack> it = tracks.iterator(); it.hasNext(); index++) { GPTrack track = it.next(); int port = track.getPort(); int channel = track.getChannel(); int channelEffects = track.getChannelEffects(); logger.fine( "Track " + index + " port " + port + " channels " + channel + "," + channelEffects); int channelIndex = (port - 1) * 16 + (channel - 1); GPMIDIChannel mc = piece.getChannels(channelIndex); int strings = track.getNumberOfStrings(); SongTrack st = new SongTrackImpl(index, strings); // channel is // 1-based st.setPrimaryDevice(new SongDeviceImpl(port, channel)); if (channel != channelEffects) { st.setSecondaryDevice(new SongDeviceImpl(port, channelEffects)); } st.setBendSensitivity(2); int instrument = mc.getInstrument(); logger.fine("Instrument " + instrument); // Only set valid instruments. The drum track usually doesn't have // one. st.setProgram(instrument); // TODO Verify the volume setting is correct st.setVolume(8 * mc.getVolume()); // TODO Verify the pan setting is correct st.setPan(8 * mc.getBalance()); // TODO Verify the chorus setting is correct st.setChorus(8 * mc.getChorus()); // TODO verify the reverb setting is correct st.setReverb(8 * mc.getReverb()); // TODO Verify the tremolo setting is correct st.setTremolo(8 * mc.getTremolo()); // TODO Verify the phaser setting is correct st.setPhaser(8 * mc.getPhaser()); song.addTrack(st); } List<GPMeasureTrackPair> measureTrackPairs = piece.getMeasuresTracksPairs(); logger.finer("Measure/Track pairs: " + measureTrackPairs.size()); ListIterator<GPMeasureTrackPair> itMTP = measureTrackPairs.listIterator(); ListIterator<GPMeasure> itM = measures.listIterator(); while (itM.hasNext()) { SongPhrase sp = phraseFactory(song, itM, itMTP, tracks); song.addPhrase(sp); } logger.exiting(className, methodName, song); return song; }