java - 计算音乐搜索栏的轨道位置

标签 java math midi

如何计算搜索栏上的音乐轨道位置?

我已经创建了一个普通的音乐播放器 GUI 作为 midi 音频播放器的演示,我想为其创建一个搜索栏。我已经为它创建了所有内容,但我一直在努力计算搜索位置指示器的 x 位置。

播放了 2 秒(尺寸:640x480)(TrackPosX:260/475,其中 475 是搜索栏 endX)

我的渲染方法的片段

int trackPosY = this.getHeight()/2+this.getHeight()/4+40; //Y coordinate of seek bar/seek indicator/end and begin points

//Draws seek bar with end points        
g.drawLine(this.getWidth()/4, trackPosY, this.getWidth()/2+this.getWidth()/4, trackPosY);  //Draws Seek bar
g.drawLine(this.getWidth()/4, trackPosY-10, this.getWidth()/4, trackPosY+10); //Draws Begin point
g.drawLine(this.getWidth()/2+this.getWidth()/4+1, trackPosY-10, this.getWidth()/2+this.getWidth()/4+1, trackPosY+10); //Draws End line (Not sure why I have to add 1 to the x but if I don't the seek bar breaches the width of the end line.)

if(midiPlayer != null && (midiPlayer.getState() == SimpleMidiPlayer.PLAY || midiPlayer.getState() == SimpleMidiPlayer.PAUSE)){
    int trackLineLength = (this.getWidth()/4+this.getWidth()/2 - this.getWidth()/4); //Length of the line, not sure if necessary
    int trackPosX = (int) ((midiPlayer.getTickPosition()/trackLineLength*midiPlayer.getTicksTotal()/trackLineLength) + (this.getWidth()/4)); //Attempt at finding X Coordinate
    g.fillOval( trackPosX-3, trackPosY-3, 6, 6); //Draws Seek position indicator
    debugTrackPos.setDebugText("TrackPosX: "+trackPosX+"/"+(this.getWidth()/4+this.getWidth()/2)+" Tick: "+midiPlayer.getTickPosition()+"/"+midiPlayer.getTicksTotal()); //Debugging purposes (top left of pic)
}

最佳答案

看起来你已经很接近了,基本原理是这样的:

ratio = var/total;
position = (max-min)*ratio +min

您的变量是:

var = midiPlayer.getTickPosition()
total = midiPlayer.getTicksTotal()
ratio = midiPlayer.getTickPosition()/midiPlayer.getTicksTotal()

(you already have max-min defined as trackLineLength)
max = this.getWidth()/4+this.getWidth()/2 
min = this.getWidth()/4

因此,使用这些变量,您将得到以下结果:

int trackPosX = (int)( ((double)midiPlayer.getTickPosition())/midiPlayer.getTicksTotal()
                * trackLineLength + this.getWidth()/4)

注意,我在 getTickPosition/getTicksTotal 上的划分中添加了 (double) 转换。我的猜测是这些是返回的整数值,除非将其转换为 double 值,否则每次除法都会得到 0。

关于java - 计算音乐搜索栏的轨道位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776324/

相关文章:

java - 如何修复任务 ':app:lintVitalRelease'的执行失败

java - 无论如何加速mapdb?

Java替换文本文件中的特定字符串

algorithm - 检测位图中的三角形

c++ - 如何提取以 midi 文件格式播放的所有乐器?

midi - 我可以通过发送错误数据来毁掉 MIDI 设备吗?

java - 从静态 ThreadLocal 变量更改 Spring Data Repositories 的 Mongo 集合是否线程安全?

python - 如何处理 python math.ceil 中的舍入错误

java - Java 中的等概率

java - 如何连接midi接收器输出数据?