複数の RGB カラー フェードを複数のライトに送信する linux/bash スクリプトがあります。すべてのライトは独自の色を持つことができますが、フェードイン/フェードアウトにはすべての色が同じ時間を使用する必要があります。そのため、初期値と速度乗数に基づいて、3 つの異なるターゲット値範囲のシーケンスを送信します。
私が遭遇した問題は、色が赤、緑、青の 3 つのチャネル (0-255) によって定義されていることです。対象となる色によっては、1 つのチャネルの値が 10 で、もう 1 つのチャネルの値が 230 である可能性があります。スムーズに作業するには、0 から開始し、同じ時間/ステップで最大値で終了する必要があります。さらに問題なのは、値を 0.112 として使用できないことです。0 または 1 である必要があります。
現時点では、使用する色の量を制限し、チャネルごとに「半分の範囲」の値のみを設定することで、この問題を解決できました。例えば。R255 G128 B000. このようにして、私はそれを機能させることができました(不正確さの許容範囲内で)。各チャネルに対して、各チャネルのフェードイン/アウトの速度に影響を与える個別の基本乗数を作成しました(255 2xの場合、128 の場合は 1x、000 の場合は 0x)
3 つのライトがあり、必要なライトにのみ値シーケンスを送信したいので、3 つの RGB 値を合計してゼロが等しいかどうかを確認します。そうであれば、割り当てられたライトはトリガーされません。
[Q] このスクリプトを最適化して、すべての RGB 値で機能し、色間でフェードできるようにする方法を教えてください。最も重要な条件は、グローバル速度乗数を適用できる必要があり、コンマの後ろに値を指定できないことです。
以下は、これまでに作成したスクリプトです。基本的には同じ行をコピーして貼り付けたものですが、他の名前が付いているため、他のライトの複製を取り出しました。
maxR=000, maxG=000, maxB=255, speed=10,
toggle=$(($maxR + $maxG + $maxB))
subR=$(echo $maxR | cut -c-1), subG=$(echo $maxG | cut -c-1), subB=$(echo $maxB | cut -c-1),
mulR=$(($subR*$speed)), mulG=$(($subG*$speed)), mulB=$(($subB*$speed))
count=0
while [ $count -lt 3 ] ; do
count=$(($count +1))
while [ $varR -lt $maxR ] || [ $valG -lt $maxG ] || [ $valB -lt $maxB ] ; do
[[ $toggle -gt 0 ]] && $valR to red && $valG to green && $valB to blue
varR=$(($varR +$mulR))
valG=$(($valG +$mulG))
valB=$(($valB +$mulB))
done
sleep 1
while [ $varR -gt 0 ] || [ $valG -gt 0 ] || [ $valB -gt 0 ] ; do
[[ $toggle -gt 0 ]] && $valR to red && $valG to green && $valB to blue
varR=$(($varR -$mulR))
valG=$(($valG -$mulG))
valB=$(($valB -$mulB))
done
sleep 3
done