Вверх ↑
Ответов: 8921
Рейтинг: 823
#1: 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