计算音乐搜索栏的曲目位置

时间:2015-01-05 09:11:25

标签: 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)
}

1 个答案:

答案 0 :(得分:2)

看起来很接近,基础知识是这样的:

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)

注意我在(double)上向部门添加了getTickPosition/getTicksTotal演员。我的猜测是这些是返回的整数值,除非你将它转换为double,否则每次除法都会得到0。

相关问题