audio - 如何反转 slider 的这个 ln 幂函数?

标签 audio slider mixer natural-logarithm math-functions

我能够从 Helmut Sennewald 的 LTSpic 电位器代码中翻译出来。
但数学不是我的事,所以我不确定是否有可能扭转这一点,如果给定点
ln 段算法将在原始直线段上返回相应的值。现在我 super 天真的解决方案是扫描东西以获得答案。这是原始的工作前向代码。

//power function slider 
public float projectOntoSegment(float val, float min, float max) {

    //val is location as percentage on segment
    float range = max - min;
    float tap_point = 0.2f;//knee point as percentage
    float tap_val = range * 0.05f; //how much at knee:lets say 5% of scale
    double exp = Math.log(tap_val / range) / Math.log(tap_point);
    double ratio = Math.pow(val, exp);
    float eff_val = min + (float) (range * ratio);

    //eff_val = min + (range*val);//linear

    return eff_val;
}

最佳答案

我在一些stackoverflow和运气的帮助下找到了解决方案。为什么甚至需要这个?因为在对数 slider 的初始化阶段需要它。以下是方法和示例用法。用户给出对数刻度的初始值。它仍然只是想要的值(value)而不是真实的。要获得有效值,需要的值必须首先在 slider 上反向映射为等效线性值,然后馈入正向对数映射。这会产生良好而流畅的全方位 slider 体验。

//ln power log
public float projectOntoLogCurve(float input, float min, float max, float kneePoint, float kneeMount) {

    //input is location as percentage on segment
    float range = max - min;
    double exp = Math.log(kneeMount) / Math.log(kneePoint);
    double ratio = Math.pow(input, exp);
    float output = min + (float) (range * ratio);

    return output;
}

//**********************************************
//reverse ln power log
public float projectBackFromLogCurve(float ln_input, float min, float max, float kneePoint, float kneeMount) {

    //ln_input is logaritmic location  on log curve
    float range = max - min;
    float z = (ln_input - min) / range;
    double exp = Math.log(kneeMount) / Math.log(kneePoint);
    float output = (float) Math.pow(z, 1.0 / exp);
    return output;// projection from log curve to linear curve
}

像这样使用:
    float min = -20.0f;
    float max = 100.0f;
    float def_val = 42.0f;
    float knee_point = 0.2f; //choose point as percentage on slider
    float knee_mount = 0.05f; //choose level value at that point
    float initVal = projectBackFromLogCurve(def_val, min, max, knee_point, knee_mount);
    this.value = initVal;
    float start = projectOntoLogCurve(this.value, min, max, knee_point, knee_mount);
    //now you have valid init value for slider
    setEffectiveValue(start);

关于audio - 如何反转 slider 的这个 ln 幂函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59690660/

相关文章:

audio - 在特定时间将文件合并在一起

html - 如何让一个声音文件在整个网站持续播放?

javascript - 照片 slider

javascript - 如何限制在 jQuery slider 上按下按键的频率?

python - 没有 while True 循环的 Pygame 播放列表

audio - C++的音频处理库

android - Android:重置音频

javascript - JQuery 中 slider 标题的问题

objective-c - 无法使用 MusicPlayer 和 AUGraph 在 iOS 中设置多个乐器

c++ - 经典混音器