Esempio n. 1
0
  /**
   * @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;
  }