Вверх ↑
Этот топик читают: Гость
Ответов: 1291
Рейтинг: 47
#1: 2023-03-29 23:29:47 ЛС | профиль | цитата
Вот еще интересная подзадача возникла - как цвета калейдоскопа преобразовать в ноты? Чтобы самому низкочастотному цвету, красному, соотвествовала самая нижняя нота, самому фиолетовому - самая верхняя.
То есть преобразовать RGB в линейный диапазон цветов в виде числа 0 - NNN.
Первое что пришло в голову - взять компонент

Add(ToRGB,16104365,910,728)
{
}

и затем тупо конкатенировать как строки числа соответствующие цветам с его нижних точек, начиная с синего : B + G + R. Тогда красный окажется в наименее значащем десятичном разряде и по идее, это создаст непрерывность палитры и ее числового описания.
Может есть другой способ? в Хиасме цвета тоже каким-то десятичным числом обозначаются, может это тоже самое?

--- Добавлено в 2023-03-29 23:35:12

А еще лучше не как строки соединять, а как десятичные числа:

Add(Img_GetPoint,12636372,910,672)
{
link(onGetPixel,2312092:doEvent1,[])
}
Add(Hub,2312092,959,672)
{
OutCount=4
link(onEvent4,16104365:doGetRGB,[(985,699)(985,717)(898,717)(898,734)])
}
Add(ToRGB,16104365,910,728)
{
link(onResult,7723617:doCalc,[(954,734)(954,762)(898,762)(898,790)])
link(Color,12636372:Color,[])
}
Add(MathParse,7723617,910,784)
{
@Hint=#38:Math.sin((Math.PI * angl / 180) / 2), |30:x = 150 + R * cos ((pi *2)* t)|31:y = 150 + R * sin (-(pi *2)* t)|27:%3 + %2 * cos ((pi *2)* %1)|
DataCount=3
MathStr="(%1 * 1) + (%2 * 10) + (%3 * 100)"
link(X1,16104365:R,[])
link(X2,16104365:G,[])
link(X3,16104365:B,[])
}


--- Добавлено в 2023-03-29 23:47:51

255 + 2550 + 25500 = 28305 Это максимальное число будет соответствовать белому цвету.
4 октавы по 12 нот = 48 нот. 28305 / 48 = 590. Значит каждая нота соответствует изменению десятичного цвета на 590 единиц. Теперь просто поделим текущий десятичный цвет / 590 и округлив получим номер нужной ноты. Вроде верно..

Редактировалось 3 раз(а), последний 2023-03-30 10:28:58
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1291
Рейтинг: 47
#2: 2023-03-30 00:57:32 ЛС | профиль | цитата
Готово

Add(Img_GetPoint,12636372,910,672)
{
link(onGetPixel,2312092:doEvent1,[])
}
Add(Hub,2312092,959,672)
{
OutCount=4
link(onEvent4,16104365:doGetRGB,[(985,699)(985,717)(898,717)(898,734)])
}
Add(ToRGB,16104365,910,728)
{
link(onResult,7723617:doCalc,[(954,734)(954,762)(898,762)(898,790)])
link(Color,12636372:Color,[])
}
Add(MathParse,7723617,910,784)
{
@Hint=#38:Math.sin((Math.PI * angl / 180) / 2), |30:x = 150 + R * cos ((pi *2)* t)|31:y = 150 + R * sin (-(pi *2)* t)|27:%3 + %2 * cos ((pi *2)* %1)|
DataCount=4
MathStr="round( (%1 + (%2 * 10) + (%3 * 100)) / ((28305 / (12 * %4))) )"
link(onResult,7720881:doCompare,[])
link(X1,16104365:R,[])
link(X2,16104365:G,[])
link(X3,16104365:B,[])
}
Add(Label,7556201,1158,901)
{
Left=124
Top=180
Width=35
Height=17
Caption="Speed"
}
Add(If_else,7720881,966,784)
{
Type=2
Op2=Integer(0)
link(onTrue,14816744:doCompare,[])
}
Add(If_else,14816744,1015,784)
{
Type=1
Op2=Integer(48)
link(onTrue,7556201:doText,[(1103,790)(1103,907)])
}


Редактировалось 2 раз(а), последний 2023-03-30 00:59:02
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8921
Рейтинг: 823
#3: 2023-03-30 16:45:48 ЛС | профиль | цитата
Aziz, ну хотя бы посмотреть, что такое RGB -- три байта по байту на каждый цвет, перед сложением с R, G умножается на 256, B на 65536, получается одно трёхбайтное беззнаковое целое, блин)
звук


Add(MainForm,2953706,252,42)
{
link(onCreate,398796:doEvent1,[])
}
Add(Img_GetPoint,12636372,392,140)
{
X=1
Y=1
link(onGetPixel,2312092:doEvent1,[])
link(Bitmap,342279:Var3,[(398,110)])
}
Add(Hub,2312092,441,140)
{
OutCount=4
link(onEvent1,16104365:doGetRGB,[])
}
Add(ToRGB,16104365,476,140)
{
link(onResult,2111790:doStart,[(515,146)(515,153)(466,153)(466,202)])
}
Add(Random,16393333,294,140)
{
Max=16777215
link(onRandom,3578194:doDraw,[])
}
Add(Timer,4949509,245,140)
{
Interval=500
link(onTimer,16393333:doRandom,[])
}
Add(Bitmap,3659496,357,49)
{
HWidth=3
HHeight=3
Point(doCreate)
}
Add(Img_Point,3578194,343,140)
{
X=1
Y=1
Point(Color)
link(onDraw,12636372:doGetPixel,[])
link(Bitmap,342279:Var1,[(349,110)])
}
Add(GetDataEx,342279,357,105)
{
link(Data,3659496:Bitmap,[])
}
Add(BASS_Version,10183901,469,42)
{
link(onCheckFailed,109118:doMessage,[(508,55)(508,62)(459,62)(459,90)])
}
Add(Message,11232751,413,84)
{
Message="Error BASS initialization"
Caption="Error"
Icon=1
}
Add(Message,109118,469,84)
{
Message="Incorrect version of BASS library "
Caption="Error"
Icon=1
}
Add(BASS_Init,4252681,413,42)
{
link(onInit,10183901:doCheck,[])
link(onError,11232751:doMessage,[(452,55)(452,62)(403,62)(403,90)])
}
Add(Hub,398796,308,56)
{
link(onEvent1,4252681:doInit,[(333,62)(333,48)])
link(onEvent2,3659496:doCreate,[])
}
Add(BASS_StreamCreate,14476773,476,301)
{
Name="MainSound"
link(onCreate,3047460:doPlay,[])
link(onError,93305:doMessage,[(520,314)(520,356)])
link(Data,2407731:GetData,[])
}
Add(Message,93305,532,350)
{
}
Add(BASS_ChannelPlay,3047460,532,301)
{
Channel="MainSound"
}
Add(EventFromData,2407731,476,252)
{
link(onEvent,2111790:doNextSound,[(522,258)(522,237)(466,237)(466,209)])
}
Add(InlineCode,2111790,476,196)
{
WorkPoints=#34:doStart=Расчёт начальных установок|42:doNextSound=Выдать следущее значение звука|
EventPoints=#34:onMax=Вывод максимального значения|34:onColMax=Цвет индикатора максимума|50:onNextSound=Выдаёт в поток следущее значение звука|7:onError|
DataPoints=#21:Red=Уровень красного;|23:Green=Уровень зелёного;|20:Blue=Уровень синего;|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|29: AmplR,AmplG,AmplB:double;|14: Res:smallint;|29: FreqR,FreqG,FreqB:double;|16: Tik:integer;|9: public|25: _data_Data:THI_Event;|18: Red:THI_Event;|20: Green:THI_Event;|19: Blue:THI_Event;|18: Vol:THI_Event;|63: onMax:THI_Event; //Вывод максимального значения|60: onColMax:THI_Event; //Цвет индикатора максимума|73: onNextSound:THI_Event; //Выдаёт в поток следущее значение звука|23: onError:THI_Event; |0:|86: procedure doStart(var _Data:TData; Index:word); //Установка начальных значений|88: procedure doNextSound(var _Data:TData; Index:word); //Выдать следущее значение звука|6: end;|4: |14:implementation|6: const|23: R = 5.01063529409626;|29: dig2ln = 0.086643397569993;|31: dig2pi = 0.00014247585730566;|9: K = 42;|13: E = 0.9999;|0:|30:procedure THiAsmClass.doStart;|22: var AR,AG,AB:integer;|5: |6: begin|9: Tik:=0;|33: AR:=ReadInteger(_Data,Red,127);|35: AG:=ReadInteger(_Data,Green,127);|34: AB:=ReadInteger(_Data,Blue,127);|14: AmplR:=AR*K;|14: AmplG:=AG*K;|14: AmplB:=AB*K;|41: FreqR:=dig2pi*exp(R+dig2ln*(AR mod 8));|45: FreqG:=dig2pi*exp(R+dig2ln*(8+(AG mod 8)));|46: FreqB:=dig2pi*exp(R+dig2ln*(16+(AB mod 8)));|31: _hi_OnEvent(onError, FreqB); |5: end;|1: |0:|34:procedure THiAsmClass.doNextSound;|1: |6: begin|13: Tik:=Tik+1;|84: Res:= round(AmplR*(sin(Tik*FreqR))+AmplG*(sin(Tik*FreqG))+AmplB*(sin(Tik*FreqB)));|17: AmplR:=AmplR*E;|17: AmplG:=AmplG*E;|17: AmplB:=AmplB*E;|35: _hi_OnEvent(onNextSound, Res); |6: end; |3: |4:end.|
link(onNextSound,2407731:doData,[(515,216)(515,244)(466,244)(466,258)])
link(Red,16104365:R,[])
link(Green,16104365:G,[])
link(Blue,16104365:B,[])
}
Add(Button,4973713,413,301)
{
Left=5
Top=5
link(onClick,14476773:doCreate,[])
}
Add(Button,16720679,413,343)
{
Left=5
Top=40
link(onClick,14476773:doDestroy,[(452,349)(452,314)])
}

карма: 19

0
Ответов: 1291
Рейтинг: 47
#4: 2023-03-30 17:44:03 ЛС | профиль | цитата
Леонид, круто, спасибо! То что RGB цвет занимает байт я знал, просто не знал как в Хиасм его получают. А чем мой способ умножением на 10 хуже? Тем что зеленый цвет пересекаться будет с красным или синим? Точно, будут( Например, если зеленый 1 то он станет после умножения 10, и красный может быть 10.. Сейчас исправлю) А я то думаю, чего такая странная музыка у меня получается))

--- Добавлено в 2023-03-30 17:46:14

Я получается, изобрел велосипед) Да еще и с квадратными колесами..

Редактировалось 1 раз(а), последний 2023-03-30 17:46:14
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 5227
Рейтинг: 587
#5: 2023-03-30 19:05:06 ЛС | профиль | цитата
Aziz писал(а):
То что RGB цвет занимает байт я знал

А вот с этого места по подробней...
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 1291
Рейтинг: 47
#6: 2023-03-31 00:56:10 ЛС | профиль | цитата
andrestudio, я имел в виду один из 3-х цветов (компонентов цвета) RGB - число 255 умещается в байт. Все цвета, соответственно в 3 байтах.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)