簡體   English   中英

如何使用Java列出Midi文件中的儀器名稱?

[英]How to list instrument names in a Midi file with Java?

我使用以下代碼播放midi文件,但我找不到使用的樂器列表:

      try
      {
        Sequence sequence=MidiSystem.getSequence(file);                                  // From file

        int trackNumber=0;
        for (Track track : sequence.getTracks())
        {
          trackNumber++;
          System.out.println("Track "+trackNumber+": size = "+track.size());
          System.out.println();
          for (int i=0;i<track.size();i++)
          {
            MidiEvent event=track.get(i);
            System.out.print("@"+event.getTick()+" ");
            if (message instanceof ShortMessage)
            {
              ShortMessage sm=(ShortMessage)message;
              System.out.print("Channel: "+sm.getChannel()+" "+new String(sm.getMessage())+" | ");
            }
            else Out("Other message: "+message.getClass());
          }
          System.out.println();
        }

        Sequencer sequencer=MidiSystem.getSequencer();
        sequencer.open();
        sequencer.setSequence(sequence);
        sequencer.start();                                                                               
      }
      catch (Exception e) { e.printStackTrace(); }

我做了一些搜索,有類似的問題,但沒有一個有直接的答案,我只想要文件中使用的列表工具,如鋼琴,鼓...我知道信息隱藏在消息中[可能被稱為“程序“?! ],但我找不到它。

這是答案,我終於明白了:

Instrument instruments[];
Soundbank sb=synthesizer.getDefaultSoundbank();
if (sb!=null) instruments=synthesizer.getDefaultSoundbank().getInstruments();

...

      try
      {
        Sequence sequence=MidiSystem.getSequence(file);                                  // From file

        int trackNumber=0;
        for (Track track : sequence.getTracks())
        {
          System.out.print("Track "+(trackNumber++)+" : ");
          MidiEvent event=track.get(0);
          MidiMessage message=event.getMessage();
          if (message instanceof ShortMessage)
          {
            ShortMessage sm=(ShortMessage)message;
            if (sm.getCommand()==192) Out("sm.getChannel()="+sm.getChannel()+"  sm.getData1()="+sm.getData1()+"  "+instruments[sm.getData1()]);
          }
        }

輸出如下所示:

Track 0 : sm.getChannel()=0  sm.getData1()=0  Instrument: Piano 1      bank #0 preset #0
Track 1 : sm.getChannel()=1  sm.getData1()=16  Instrument: Organ 1      bank #0 preset #16
Track 2 : sm.getChannel()=2  sm.getData1()=56  Instrument: Trumpet      bank #0 preset #56
Track 3 : sm.getChannel()=3  sm.getData1()=25  Instrument: Steel-str.Gt bank #0 preset #25

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM