Вверх ↑
Этот топик читают: Гость
Ответов: 494
Рейтинг: 163
#1: 2018-11-03 17:42:43 ЛС | профиль | цитата
Всем привет. Прошу помочь, "пнуть" в нужном направлении - застрял.
Задача построить график "затухающих колебаний" похожий как на приложенной картинке.
11.png
Приложенный код, максимально "приближенный" чего у меня получилось.


Add(MainForm,2953706,133,112)
{
Width=525
Height=349
Position=1
link(onCreate,9005977:doData,[])
}
Add(Plotter,10574215,406,84)
{
Left=20
Top=30
Width=472
Height=259
Color=0
Name="Plotter"
AxisColor=-16777201
GridX=4
GridY=4
MinH=-0.13
MaxH=0.13
MinW=13
LeftMargin=1
RightMargin=1
TopMargin=1
BottomMargin=1
MouseControl=1
Point(doGridX)
}
Add(Math,14060830,581,175)
{
OpType=13
link(onResult,5766275:doOperation,[])
}
Add(PlotLines,7547227,679,175)
{
Grapher="Plotter"
Color=65280
Size=2
Step=1
Name="series1"
}
Add(Math,5766275,630,175)
{
OpType=3
Op2=2
link(onResult,7547227:doAdd,[])
link(Op2,14120396:Result,[(643,157)(569,157)(569,216)(531,216)])
}
Add(For,14310219,476,175)
{
Start=50
End=1000
link(onEvent,14120396:doOperation,[])
link(End,4485685:Result,[(489,167)(412,167)])
}
Add(Math,14120396,525,175)
{
OpType=3
Op2=10
link(onResult,14060830:doOperation,[])
}
Add(Math,4485685,406,126)
{
OpType=2
Op2=10
Default=500
link(onResult,14310219:doFor,[(466,132)(466,181)])
}
Add(Hub,14297453,350,84)
{
link(onEvent1,10574215:doClear,[])
link(onEvent2,4485685:doOperation,[(385,97)(385,132)])
}
Add(ScrollBar,14350462,196,84)
{
Left=20
Top=10
Width=295
Max=100
Min=2
Position=11
link(onPosition,3952393:doEvent1,[])
}
Add(Math,15891841,301,84)
{
OpType=2
Op2=6.9
link(onResult,14297453:doEvent1,[])
}
Add(Edit,8121418,301,133)
{
Left=330
Top=5
Text="0"
}
Add(Hub,3952393,252,84)
{
InCount=2
link(onEvent1,15891841:doOperation,[])
link(onEvent2,8121418:doText,[(284,97)(284,139)])
}
Add(DoData,9005977,196,126)
{
Data=Integer(11)
link(onEventData,3952393:doEvent2,[(243,132)(243,97)])
}

карма: 4

0
Ответов: 9906
Рейтинг: 351
#2: 2018-11-03 19:17:02 ЛС | профиль | цитата
Дожились....
Add(MainForm,13312813,140,161)
{
Width=525
Height=349
Position=1
link(onCreate,9005977:doData,[])
}
Add(Plotter,10574215,413,119)
{
Left=20
Top=30
Width=472
Height=259
Color=0
Name="Plotter"
AxisColor=-16777201
GridX=4
GridY=4
MinH=-0.13
MaxH=0.13
MinW=13
LeftMargin=1
RightMargin=1
TopMargin=1
BottomMargin=1
MouseControl=1
}
Add(Math,14060830,616,119)
{
OpType=13
link(onResult,13420202:doOperation,[])
}
Add(PlotLines,7547227,721,182)
{
Grapher="Plotter"
Color=65280
Size=2
Step=1
Name="series1"
}
Add(Math,5766275,665,182)
{
OpType=2
link(onResult,7547227:doAdd,[])
link(Op1,13420202:Result,[])
}
Add(For,14310219,462,175)
{
Start=50
InData=0
link(onEvent,13560574:doEvent1,[])
}
Add(Math,14120396,567,119)
{
OpType=2
Op2=0.1
link(onResult,14060830:doOperation,[])
}
Add(Math,4485685,413,175)
{
OpType=2
Op2=10
Default=500
link(onResult,14310219:doFor,[])
}
Add(Hub,14297453,371,119)
{
link(onEvent1,10574215:doClear,[])
link(onEvent2,4485685:doOperation,[(396,132)(396,181)])
}
Add(ScrollBar,14350462,140,119)
{
Left=20
Top=10
Width=295
Max=100
Min=2
Position=11
link(onPosition,414565:doWork2,[])
}
Add(Math,15891841,315,119)
{
OpType=2
Op2=6.9
link(onResult,14297453:doEvent1,[])
}
Add(Edit,8121418,259,119)
{
Left=330
Top=5
Text="0"
link(onChange,15891841:doOperation,[])
}
Add(DoData,9005977,189,175)
{
Data=Integer(11)
link(onEventData,414565:doWork3,[(235,181)])
}
Add(HubEx,414565,231,119)
{
link(onEvent,8121418:doText,[])
}
Add(Hub,13560574,511,175)
{
link(onEvent1,14120396:doOperation,[(536,181)(536,125)])
link(onEvent2,14234002:doOperation,[])
}
Add(Math,14234002,567,182)
{
OpType=2
Op2=-0.005
link(onResult,13989208:doOperation,[])
}
Add(Math,13989208,616,182)
{
OpType=30
link(onResult,5766275:doOperation,[])
}
Add(Math,13420202,665,119)
{
OpType=2
Op2=0.2
}
Скоро, наверное, будут спрашивать решение квадратного уравнения.
Надо бы, на этот случай - песенку из Радио-Няни заучить.

Редактировалось 4 раз(а), последний 2018-11-04 12:02:33
карма: 9

0
Ответов: 8921
Рейтинг: 823
#3: 2018-11-03 20:01:27 ЛС | профиль | цитата
Galkov,
tig-rrr, или так:
С регулировкой затухания


Add(MainForm,8416226,231,147)
{
Width=525
Height=349
Position=1
link(onCreate,9005977:doData,[])
}
Add(Plotter,10574215,392,112)
{
Left=20
Top=50
Width=472
Height=239
Color=0
Name="Plotter"
AxisColor=-16777201
GridX=4
GridY=4
MinH=-1.5
MaxH=1.5
LeftMargin=1
RightMargin=1
TopMargin=1
BottomMargin=1
MouseControl=1
}
Add(PlotLines,7547227,518,217)
{
Grapher="Plotter"
Color=65280
Size=2
Step=1
Name="series1"
}
Add(For,14310219,392,217)
{
End=1000
link(onEvent,210580:doCalc,[])
}
Add(ScrollBar,14350462,294,112)
{
Left=20
Top=5
Width=295
Max=100
Min=2
Position=11
link(onPosition,8593164:doWork2,[])
}
Add(Edit,8121418,392,161)
{
Left=330
Top=5
Text="0"
link(onChange,11035440:doCalc,[])
link(Str,6281013:Var3,[(398,152)])
}
Add(Hub,3952393,350,112)
{
link(onEvent1,10574215:doClear,[])
link(onEvent2,8121418:doText,[(382,125)(382,167)])
}
Add(DoData,9005977,294,161)
{
Data=Integer(11)
link(onEventData,8593164:doWork3,[(340,167)])
link(Data,6281013:Var2,[])
}
Add(MathParse,210580,441,217)
{
DataCount=3
MathStr="sin(%1*%2)/exp(%1/%3)"
link(onResult,11819110:doEvent1,[])
link(X2,11035440:Result,[])
link(X3,3337172:Position,[(461,103)(300,103)])
}
Add(MathParse,11035440,448,161)
{
DataCount=1
MathStr="2*Pi*%1/1000"
link(onResult,14310219:doFor,[(487,167)(487,202)(382,202)(382,223)])
}
Add(ScrollBar,3337172,294,56)
{
Left=20
Top=25
Width=295
Max=2000
Min=2
Position=100
link(onPosition,8593164:doWork1,[(340,62)])
}
Add(HubEx,8593164,336,112)
{
link(onEvent,3952393:doEvent1,[])
}
Add(GetDataEx,6281013,294,147)
{
link(Data,14350462:Position,[])
}
Add(Hub,11819110,483,217)
{
link(onEvent1,7547227:doAdd,[])
link(onEvent2,6748238:doCalc,[(508,230)(508,258)(431,258)(431,272)])
}
Add(MathParse,6748238,441,266)
{
DataCount=1
MathStr="((%1>0.001) - (%1<0.001))*0.1-1"
link(onResult,2255259:doAdd,[])
}
Add(PlotLines,2255259,518,266)
{
Grapher="Plotter"
Color=65535
Size=2
Step=1
}

карма: 19

0
Ответов: 494
Рейтинг: 163
#4: 2018-11-03 20:45:47 ЛС | профиль | цитата
Galkov Спасибо! Леонид То что надо!
карма: 4

0
Ответов: 1535
Рейтинг: 176
#5: 2018-11-04 13:22:13 ЛС | профиль | цитата
А как получить тот же график из существующего файла звукового потока? Пример хотелось бы увидеть. Скажем, загружаю я файл для воспроизведения, и тут же получаю весь его волновой график.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 8921
Рейтинг: 823
#6: 2018-11-04 14:15:00 ЛС | профиль | цитата
ser_davkin, "BASS_ChannelVisibleOcilloScope" специально для вас

Add(BASS_ChannelVisibleOcilloScope,5577192,168,231)
{
}

карма: 19

0
Ответов: 1535
Рейтинг: 176
#7: 2018-11-04 17:18:06 ЛС | профиль | цитата
Леонид, а как статичный волновой график всего аудиофайла сделать с этим элементом?

Вот такой график:
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 8921
Рейтинг: 823
#8: 2018-11-05 00:58:25 ЛС | профиль | цитата
ser_davkin, график из файла запросто можно только из *.wav, там без искажений, а остальные форматы надо знать, как сжимаются и расшифровываются (я не знаю). А вот кодеки знают, можно запустить воспроизведение и через BASS считывать.
График


Add(BASS_Version,10183901,210,105)
{
link(onCheckOk,2256191:doEvent1,[])
link(onCheckFailed,109118:doMessage,[(254,118)(254,160)])
}
Add(Message,11232751,210,154)
{
Message="Error BASS initialization"
Caption="Error"
Icon=1
}
Add(Message,109118,266,154)
{
Message="Incorrect version of BASS library "
Caption="Error"
Icon=1
}
Add(MainForm,16358250,77,91)
{
Width=597
Height=411
Caption="Plotter Sound"
Point(Handle)
link(onCreate,4252681:doInit,[])
}
Add(BASS_Init,4252681,154,105)
{
link(onInit,10183901:doCheck,[])
link(onError,11232751:doMessage,[(198,118)(198,160)])
link(Handle,16358250:Handle,[(174,93)(128,93)(128,135)(83,135)])
}
Add(Button,13089460,154,336)
{
Left=250
Top=10
Width=60
Caption="Plotter"
link(onClick,12319927:doEvent1,[])
}
Add(Button,13708268,154,252)
{
Left=255
Top=50
Caption="Record"
link(onClick,8021993:doEvent1,[])
}
Add(Button,14140950,154,301)
{
Left=320
Top=50
Caption="Stop"
link(onClick,11038749:doEvent1,[])
}
Add(BASS_RecordCenter,12302345,448,119)
{
link(onError,11713735:doMessage,[])
}
Add(Message,11713735,497,126)
{
Message="InitRecord failed!"
Caption="Error"
Icon=1
}
Add(BASS_RecordDevices,2046235,294,112)
{
link(onEnum,2286951:doAdd,[])
}
Add(BASS_InputControl,10635687,399,119)
{
link(onSetInput,12302345:doInit,[])
link(Volume,16267203:Var2,[])
link(State,16267203:Var3,[(419,103)])
}
Add(ComboBox,2286951,350,112)
{
Left=10
Top=45
Width=120
Height=21
link(onClick,10635687:doSetInput,[])
}
Add(Hub,2256191,266,105)
{
link(onEvent1,2286951:doClear,[(338,111)(338,125)])
link(onEvent2,2046235:doEnum,[])
}
Add(Memory,11326935,406,63)
{
}
Add(GetDataEx,16267203,406,98)
{
link(Data,11326935:Value,[])
}
Add(InlineCode,2111790,336,259)
{
WorkPoints=#34:doStart=Расчёт начальных установок|35:doRecData=Потоковые звуковые данные|16:doPlotter=График|
EventPoints=#52:onSignalMax=Максимальное значение на входе (0-32768)|34:onColMax=Цвет индикатора максимума|26:onLeft=Выход левого канала|27:onRith=Выход правого канала|7:onError|
VarPoints=#
DataPoints=#
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|1: |10: private|28: Sound:array of smallint;|41: LenAll,Addres,AddresPlotter:cardinal;|19: PlotterIs:byte;|9: public|25: _data_Data:THI_Event;|72: onSignalMax:THI_Event; //Выход контроля за максимумом на входе|67: onColMax:THI_Event; //Выход цвета индикатора максимума|52: onLeft:THI_Event; //Выход левого канала|53: onRith:THI_Event; //Выход правого канала|22: onError:THI_Event;|0:|51: procedure doStart(var _Data:TData; Index:word);|53: procedure doRecData(var _Data:TData; Index:word);|53: procedure doPlotter(var _Data:TData; Index:word);|4:end;|0:|14:implementation|0:|0:|30:procedure THiAsmClass.doStart;|6: begin|22: setlength(Sound, 1);|19: AddresPlotter:=0;|15: PlotterIs:=0;|12: LenAll:=1;|12: Addres:=0;|2: |5: end;|1: |32:procedure THiAsmClass.doRecData;|17: var St:PStream; |18: len:cardinal;|15: i:integer;|31: _Sound,_SoundMax:smallint;|6: begin|18: _SoundMax:=0;|81: St:= ReadStream(_data,_data_Data,nil); //Читаем звуковой поток ~0,1 сек.|73: if St = nil then Exit; //Выход, если нет данных.|113: len := St.Size div 2; //Количество дискретных значений в потоке (1 канал по 2 байта). |24: LenAll:=LenAll+len;|72: setlength(Sound, LenAll); |60: for i:=0 to len-1 do |12: begin|77: St.Read(_Sound,2); //Читаем по 2 байта в _Sound |69: Sound[Addres]:=_Sound; //Записываем в массив|25: Addres:=Addres+1;|42: if _Sound<0 then _Sound:=-_Sound;|92: if _Sound>_SoundMax then _SoundMax:=_Sound; //Макстмальное значение для индикатора|12: end; |97: if _SoundMax>31000 then //Определяем цвет индикатора максимума:|98: _hi_OnEvent(onColMax, 255) //красный, если сигнал на входе большой;|9: else|11: begin|30: if _SoundMax>28000 then|106: _hi_OnEvent(onColMax, 32768) //тёмнозелёный, если сигнал на входе в пределах;|98: else _hi_OnEvent(onColMax, 65535); //жёлтый, если сигнал на входе маловат. |10: end;|42: _hi_OnEvent(onSignalMax, _SoundMax); |32: _hi_OnEvent(onLeft, Addres);|5: end;|0:|33: procedure THiAsmClass.doPlotter;|17: var i:integer;|6: begin|59: for i:=0 to Addres-1 do _hi_OnEvent(onRith, Sound[i]); |5: end;|1: |4:end.|
link(onSignalMax,12148894:doPosition,[])
link(onColMax,12148894:doColor,[])
link(onLeft,10474156:doText,[(396,279)(396,307)])
link(onRith,2752452:doAdd,[(382,286)(382,349)])
}
Add(Plotter,7887810,252,343)
{
Left=15
Top=85
Width=560
Height=285
Color=0
Name="MySound"
GridColor=16777215
BorderColor=16777215
AxisColor=65535
GridX=5
GridY=14
MinH=-35000
MaxH=35000
LeftMargin=50
RightMargin=5
TopMargin=5
MouseControl=1
}
Add(PlotLines,2752452,406,343)
{
Grapher="MySound"
Color=65535
Step=1
}
Add(Hub,8021993,196,252)
{
link(onEvent1,2111790:doStart,[(326,258)(326,265)])
link(onEvent2,3733188:doStart,[])
}
Add(If_else,16120764,280,266)
{
Op2=Integer(1)
link(onTrue,2111790:doRecData,[])
link(Op1,14396249:Value,[])
}
Add(CheckBox,65585,231,203)
{
Left=190
Top=50
Caption="Write"
link(onCheck,14396249:doValue,[])
}
Add(ProgressBar,12148894,406,259)
{
Left=20
Top=10
Width=205
Height=10
Color=32768
Max=33000
ProgressColor=65280
Point(doColor)
}
Add(BASS_RecordStart,3733188,231,259)
{
Freq=44100
Mode=1
link(onData,16120764:doCompare,[])
}
Add(Hub,12319927,203,336)
{
OutCount=3
link(onEvent1,2371045:doWork3,[(228,342)(228,335)(270,335)])
link(onEvent2,7887810:doClear,[])
link(onEvent3,2111790:doPlotter,[(323,356)(323,279)])
}
Add(Memory,14396249,280,203)
{
Default=Integer(0)
}
Add(Hub,11038749,196,301)
{
link(onEvent1,3733188:doStop,[(214,307)(214,272)])
link(onEvent2,2371045:doWork2,[])
}
Add(HubEx,2371045,266,308)
{
Angle=3
link(onEvent,14396249:doClear,[(270,216)])
}
Add(Label,10474156,406,301)
{
Left=325
Top=15
}

ГрафикЗвука.jpg
карма: 19

0
8
Сообщение
...
Прикрепленные файлы
(файлы не залиты)