2

これらの音符で構成される midi ファイルを作成したかったのです。このコードはインターネットから取得しました。これに対する問題を見つけることができれば、さらに先に進むことができます。このアプリケーションを実行すると、エラー コール「Java 結果 1」エラーのみが表示されます。私が必要とするのは、これを実行した後、私が渡したメモで構成される midi ファイルが生成されているはずです。完全なコードが利用可能です。

public class CreateSequence{
  private static final int VELOCITY = 64;
  public static void main(String[] args) {
    if (args.length != 1) {
        printUsageAndExit();
    }
    File outputFile = new File(args[0]);
    Sequence    sequence = null;
    try {
        sequence = new Sequence(Sequence.PPQ, 1);
    } catch (InvalidMidiDataException e) {
        e.printStackTrace();
        System.exit(1);
    }   
    Track track = sequence.createTrack();

    // first chord: C major
    track.add(createNoteOnEvent(60, 0));
    track.add(createNoteOnEvent(64, 0));
    track.add(createNoteOnEvent(67, 0));
    track.add(createNoteOnEvent(72, 0));
    track.add(createNoteOffEvent(60, 1));
    track.add(createNoteOffEvent(64, 1));
    track.add(createNoteOffEvent(67, 1));
    track.add(createNoteOffEvent(72, 1));

    // second chord: f minor N
    track.add(createNoteOnEvent(53, 1));
    track.add(createNoteOnEvent(65, 1));
    track.add(createNoteOnEvent(68, 1));
    track.add(createNoteOnEvent(73, 1));
    track.add(createNoteOffEvent(63, 2));
    track.add(createNoteOffEvent(65, 2));
    track.add(createNoteOffEvent(68, 2));
    track.add(createNoteOffEvent(73, 2));

    // third chord: C major 6-4
    track.add(createNoteOnEvent(55, 2));
    track.add(createNoteOnEvent(64, 2));
    track.add(createNoteOnEvent(67, 2));
    track.add(createNoteOnEvent(72, 2));
    track.add(createNoteOffEvent(64, 3));
    track.add(createNoteOffEvent(72, 3));

    // forth chord: G major 7
    track.add(createNoteOnEvent(65, 3));
    track.add(createNoteOnEvent(71, 3));
    track.add(createNoteOffEvent(55, 4));
    track.add(createNoteOffEvent(65, 4));
    track.add(createNoteOffEvent(67, 4));
    track.add(createNoteOffEvent(71, 4));

    // fifth chord: C major
    track.add(createNoteOnEvent(48, 4));
    track.add(createNoteOnEvent(64, 4));
    track.add(createNoteOnEvent(67, 4));
    track.add(createNoteOnEvent(72, 4));
    track.add(createNoteOffEvent(48, 8));
    track.add(createNoteOffEvent(64, 8));
    track.add(createNoteOffEvent(67, 8));
    track.add(createNoteOffEvent(72, 8));

    //Now we just save the Sequence to the file we specified.
    //The '0' (second parameter) means saving as SMF type 0.
    //Since we have only one Track, this is actually the only option
    //(type 1 is for multiple tracks).
    try {
        MidiSystem.write(sequence, 0, outputFile);
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }
  }

  private static MidiEvent createNoteOnEvent(int nKey, long lTick) {
    return createNoteEvent(ShortMessage.NOTE_ON, nKey, VELOCITY, lTick);
  }

  private static MidiEvent createNoteOffEvent(int nKey, long lTick) {
    return createNoteEvent(ShortMessage.NOTE_OFF, nKey, 0, lTick);
  }

  private static MidiEvent createNoteEvent(int nCommand, int nKey,
                                           int nVelocity, long lTick) {
    ShortMessage message = new ShortMessage();
    try {
        message.setMessage(nCommand, 0, nKey, nVelocity); // 0 always on channel 1
    } catch (InvalidMidiDataException e) {
        e.printStackTrace();
        System.exit(1);
    }
    MidiEvent event = new MidiEvent(message, lTick);
    return event;
  }

  private static void printUsageAndExit(){
        out("usage:");
        out("java CreateSequence <midifile>");
        System.exit(1);
  }

  private static void out(String strMessage) {
    System.out.println(strMessage);
  }
}

これが出力です

   usage:
   java CreateSequence <midifile>
   Java Result: 1
4

2 に答える 2

1

出力ファイル名を引数として渡す必要があります。正しい引数カウントで実行しないと printUsafeAndExit() が呼び出されるため、コード 1 で終了します。次のように実行してみてください。

java CreateSequence output.mid

引数の受け渡しに問題がある場合 (Eclipse などの IDE を使用している場合、初心者にとって混乱を招く可能性があります)、このチェックを削除してください。

if (args.length != 1) {
    printUsageAndExit();
}

出力ファイルをハードコードします。

File outputFile = new File("output.mid");
于 2014-10-31T04:46:44.413 に答える
0

この Java プログラムをどのように呼び出していますか? このコードは、コマンド ラインで 1 つの引数が渡されることを想定しています。出力を見ると、メソッドのように見えます

private static void printUsageAndExit()
{
    out("usage:");
    out("java CreateSequence <midifile>");
    System.exit(1);
}

呼び出されています。プログラムを実行するときにファイル名をプログラムに渡す必要があります(私は信じています)

于 2014-10-31T04:47:05.343 に答える