java - equencer.startRecording() 没有立即开始? Java MIDI

标签 java audio input midi audio-player

所以我从键盘获取 MIDI 数据并开始使用

sequence = new Sequence(Sequence.PPQ, 24);
currentTrack = sequence.createTrack();
sequencer.setSequence(sequence);
sequencer.setTickPosition(0);
sequencer.recordEnable(currentTrack, -1);
sequencer.startRecording();

我使用一个按钮来停止录制并将其保存到文件中。当我播放 MIDI 文件时,大约需要 4 秒才能开始录制。我什至播放了它保存在外部程序上的 midi 文件,看起来它在录音开始时没有添加大约 4 秒的时间。有谁知道这是为什么,或者如何修复它,以便当我播放 midi 文件时,它立即开始?

最佳答案

这是一个获取文件并删除第一个注释(事件)的函数。在这种情况下,系统添加了一个代码为 144 的事件,该事件用于 Note_On,代替文件开头的某些控制命令(设置为第一个音符的持续时间的代码 171 告诉我这就是这个意思) 。所以我们删除第一个事件。

保存后即可应用。

  public void write(Sequence s) {
    int i=0, j;
    int max=0;
    Vector notes=new Vector();
    try {
      Sequence s2=MidiPlayer.createSequence();
      Track tr2=s2.createTrack();
      long tlen=s.getMicrosecondLength()/s.getTickLength();
      Track[] tr=s.getTracks();
//      System.out.println("has tracks "+tr.length);
      Vector note=new Vector();
      for(i=0; i<tr.length; i++) {
        int l=tr[i].size()-1;
//      System.out.println(i+" has events "+l);
        int sum=0, start=0;
        MidiEvent mi=null;
        ShortMessage sm=null;
        byte[] dat=null;
        int tick=0, tick2=0;
        for(j=0; j<l; j++) {
          mi=tr[i].get(j);
          if(mi.getMessage().getStatus()==MetaMessage.META) { System.out.println("meta "); continue; }
          sm=(ShortMessage)mi.getMessage();
//      System.out.println("sm "+sm.getCommand()+" "+sm.getStatus()+" "+sm.getData1()+" "+sm.getData2());
          dat=sm.getMessage();
//        for(int ik=0; ik<dat.length; ik++) System.out.print(dat[ik]+" ");
//        System.out.println();
          tick2=(int)mi.getTick();
          int key=sm.getData1(), vel=sm.getData2();
        System.out.println(j+" "+(tick2-tick)+" "+tlen+" "+tick2+" "+tick+" ch "+sm.getChannel()+" "+key);
          if(j==0) { tick=tick2; continue; }
          notes.add(new int[]{key, vel, max, tick2-tick});
          max+=tick2-tick;
          tick=tick2;
          }
        }
        for(i=0; i<notes.size(); i++) {
          int[] ii=(int[])notes.get(i);
          if(ii==null) break;
          ShortMessage on = new ShortMessage();
          on.setMessage(ShortMessage.NOTE_ON, 0, ii[0], ii[1]);
          ShortMessage off = new ShortMessage();
          off.setMessage(ShortMessage.NOTE_OFF, 0, ii[0], ii[1]);
          tr2.add(new MidiEvent(on, ii[2]));
          tr2.add(new MidiEvent(off, ii[2]+ii[3]));
        }   
        String t=""+(System.currentTimeMillis()/1000);
        MidiPlayer.write(s2, "new-"+t+".mid");
    }
    catch(Exception e) { e.printStackTrace(); }
  }

关于java - equencer.startRecording() 没有立即开始? Java MIDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52798029/

相关文章:

java - Junit和Ant集成的另一个简单问题

c++ - FFT 频谱显示不正确

c++ - Linux,C++ 音频捕获(只是麦克风)库

c - 一行中的多个不同类型的输入

html - 如何更改 HTML-CSS 输入框中文本(由用户提供)的字体颜色?

python - 为什么这个 Python 3 代码在运行时会抛出 EOFError 错误?

java - 如何更改 Tomcats JVM 版本?

java - 在整数数组中查找缺失的数字

java - RGB 模糊算法

ios - 无法使IOS InputAudioQueue正常工作(非常简单的示例)