为了账号安全,请及时绑定邮箱和手机立即绑定

sequencer.startRecording() 没有立即开始?Java MIDI

sequencer.startRecording() 没有立即开始?Java MIDI

交互式爱情 2021-11-17 10:33:31
所以我从我的键盘获取 MIDI 数据并开始使用sequence = new Sequence(Sequence.PPQ, 24);currentTrack = sequence.createTrack();sequencer.setSequence(sequence);sequencer.setTickPosition(0);sequencer.recordEnable(currentTrack, -1);sequencer.startRecording();我使用一个按钮停止录制并将其保存到文件中。当我播放 MIDI 文件时,大约需要 4 秒钟才能开始录制。我什至播放它保存在外部程序中的 midifiles,它似乎在录制开始时增加了大约 4 秒的内容。有谁知道这是为什么或如何修复它,以便当我播放 midifile 时,它会立即开始?
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这是获取文件并删除第一个音符(事件)的函数。在这种情况下,系统添加了一个代码为 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(); }

  }



查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信