将颜色映射到振幅
mapping colors to amplitude
我正在研究音乐可视化工具,我希望频谱上的颜色根据振幅逐渐从绿色变为红色。
以下是给出的说明:
更改每个条的颜色,使其根据振幅值逐渐从绿色变为红色 [2 分]。例如
振幅值为 0,颜色值为 R:0、G:255 和 B:0。
127个色值的振幅值分别是R:127、G:127和B:0
255个色值的振幅值分别是R:255、G:0和B:0
这是我的代码:
var spectrum = fourier.analyze();
noStroke();
for (var i = 0; i< spectrum.length; i++){
var y = map(i, 0, spectrum.length, 0, height);
var w = map(spectrum[i], 0, 255, 0, width);
if(spectrum[i] > 200)
{
fill(255,0,0);
}
if(spectrum[i] > 100 && spectrum[i] < 200)
{
fill(127,127,0);
}
if(spectrum[i] > 0 && spectrum[i] < 100)
{
fill(0,255,0);
}
rect(0,y,w,height/spectrum.length);
}
颜色根据幅度变化,但我希望它们逐渐变化。感谢您的帮助
你所拥有的是函数中的特定点,但你已经为整个范围定义了这些点。你应该做的是编写一个函数,以平滑的方式输出这些值。
让我们看看您的第一个数字,我假设它是 R(红色)值。 if(spectrum[i] > 200) red = 255; if(spectrum[i] > 100 && spectrum[i] < 200) red = 127; else red = 0;
如果您不输出单个值,而是创建一个将振幅直接映射到红色值的函数,会怎样?首先,让它变得非常简单:
function getRed(amplitude) return amplitude;
假设 amplitude
从 0 开始并在 255 处达到最大值,这个函数已经让你接近你想要的 R 变量。如果该假设不安全,那么您可以轻松地重新调整函数以最小化为 0,最大化为 255。
然后我们想对下一个值 Green 做完全相反的操作。所以让我们假设我们有 red
值:绿色可以像这样简单:
function getGreen(red) return 255 - red;
那么,当红色为0时,绿色为255。当红色为255时,绿色为0。它们在中间大约相等。如有必要,您可以再次添加 min/max 逻辑。
所以你的函数看起来像这样:
for (var i = 0; i< spectrum.length; i++){
var y = map(i, 0, spectrum.length, 0, height);
var w = map(spectrum[i], 0, 255, 0, width);
const amp = spectrum[i];
const red = getRed(amp);
const green = getGreen(red);
fill(red, green, 0);
rect(0,y,w,height/spectrum.length);
}
我正在研究音乐可视化工具,我希望频谱上的颜色根据振幅逐渐从绿色变为红色。 以下是给出的说明:
更改每个条的颜色,使其根据振幅值逐渐从绿色变为红色 [2 分]。例如
振幅值为 0,颜色值为 R:0、G:255 和 B:0。 127个色值的振幅值分别是R:127、G:127和B:0 255个色值的振幅值分别是R:255、G:0和B:0
这是我的代码:
var spectrum = fourier.analyze();
noStroke();
for (var i = 0; i< spectrum.length; i++){
var y = map(i, 0, spectrum.length, 0, height);
var w = map(spectrum[i], 0, 255, 0, width);
if(spectrum[i] > 200)
{
fill(255,0,0);
}
if(spectrum[i] > 100 && spectrum[i] < 200)
{
fill(127,127,0);
}
if(spectrum[i] > 0 && spectrum[i] < 100)
{
fill(0,255,0);
}
rect(0,y,w,height/spectrum.length);
}
颜色根据幅度变化,但我希望它们逐渐变化。感谢您的帮助
你所拥有的是函数中的特定点,但你已经为整个范围定义了这些点。你应该做的是编写一个函数,以平滑的方式输出这些值。
让我们看看您的第一个数字,我假设它是 R(红色)值。 if(spectrum[i] > 200) red = 255; if(spectrum[i] > 100 && spectrum[i] < 200) red = 127; else red = 0;
如果您不输出单个值,而是创建一个将振幅直接映射到红色值的函数,会怎样?首先,让它变得非常简单:
function getRed(amplitude) return amplitude;
假设 amplitude
从 0 开始并在 255 处达到最大值,这个函数已经让你接近你想要的 R 变量。如果该假设不安全,那么您可以轻松地重新调整函数以最小化为 0,最大化为 255。
然后我们想对下一个值 Green 做完全相反的操作。所以让我们假设我们有 red
值:绿色可以像这样简单:
function getGreen(red) return 255 - red;
那么,当红色为0时,绿色为255。当红色为255时,绿色为0。它们在中间大约相等。如有必要,您可以再次添加 min/max 逻辑。
所以你的函数看起来像这样:
for (var i = 0; i< spectrum.length; i++){
var y = map(i, 0, spectrum.length, 0, height);
var w = map(spectrum[i], 0, 255, 0, width);
const amp = spectrum[i];
const red = getRed(amp);
const green = getGreen(red);
fill(red, green, 0);
rect(0,y,w,height/spectrum.length);
}