java - 跟踪行为 - Java MIDI

标签 java midi

我正在从 MIDI 轨道中删除事件,并且我假设这样做会相应减少轨道的总持续时间,如果轨道中没有事件,那么我认为轨道的大小将为 0。

不幸的是,情况似乎并非如此,即使事件被删除,Ticks 的大小也不会改变,只会随着添加更多事件而增加。

这是正常的 MIDI/Java 行为吗?

编辑:

这是从 Track 中删除所有事件的方法:

public static boolean Remove() {
    //TODO: Test the bejeezus out of it.

    if(_sequencer.isRunning()){
        _sequencer.stop();
    }

    for (int i = 0; i < _track.size(); i++) {
        if (!_track.remove(_track.get(i))) {
            Logger.Add("MIDI Event not removed");
            return false;
        }
    }

    //Used for debugging purposes
    long z = _track.ticks();
}

然而,当我使用一些粗略的调试技术并在删除事件后直接检查滴答数时,我发现了这一点;

enter image description here

看起来没什么区别,我真的不明白为什么要这样做。我假设刻度的大小取决于轨道中事件的数量,因此,如果轨道中有 10 个事件,则刻度大小将为 10(当我将它们添加到轨道时将刻度长度设置为 1),同样,如果没有大小为 0 的事件。

添加事件:

public static void AddMessage(int channel, int pitch, long tick, int velocity) {
        _track.add(CreateNoteOnEvent(channel, pitch, tick, velocity));
        _track.add(CreateNoteOffEvent(channel, pitch tick, velocity));
    }

最佳答案

经过几个小时的调试,我设法找到了错误,我删除事件的方式意味着其中一半永远不会被考虑,这导致轨道的大小永远不会达到零。

我添加的任何事件都会被放置在已经存在的事件之后,这可以解释为什么我在某些部分听到多个音符。

可以在这里找到该问题(以及这个问题)的答案:Unable to Remove Events from Track

感谢您抽出宝贵的时间,我非常感激。

关于java - 跟踪行为 - Java MIDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696421/

相关文章:

java - 使用 StringBuffer 、 StringBuilder 、 String.intern() 优化 String 对 java 堆的使用

java - 扩展 AbstractAnnotationConfigDispatcherServletInitializer 时的 getServletConfigClasses() 与 getRootConfigClasses()

ios - 如何在 Swift 中定义 MIDINotifyProc?

java - 如何在Java声音中连续改变音高?

java - 使用特定缓冲区大小的分块传输编码在 Jetty 中传输缓慢

java - Actor 异常?

java - 使用 MouseListener 和 MouseMotionListener 绘制矩形

ipad - 有没有办法在 iPhone/iPad 上实例化可通过标准 USB 连接器访问的 MIDI 设备?

python - 合并 MIDI 和 Wav 文件

java - MIDI 的可行替代品?