Make(delphi) Pos(0,32) Add(MainForm,13601262,21,136) { Left=20 Top=105 Width=556 Height=370 Caption="Осцилограф" Point(onResize) Point(Handle) link(onCreate,12869014:doEvent1,[(58,156)(58,177)]) link(onResize,11310168:doEvent1,[(89,163)(89,114)]) } Add(Image,10960719,203,3) { Left=30 Width=518 Height=343 Align=5 Color=32768 Cursor=7 Point(Width) Point(Height) Point(MouseX) Point(onMouseDown) Point(onMouseUp) Point(Handle) link(onMouseDown,3322734:doWork1,[]) link(onMouseUp,3322734:doWork2,[]) } Add(ChildPanel,9580284,119,171) { link(onEvent1,7727094:doRecData,[(161,177)(161,163)]) link(onEvent2,10356259:doEvent1,[(166,184)(166,170)]) link(onEvent3,2117885:doValue,[(161,191)(161,253)(67,253)(67,275)]) link(onEvent4,7727094:doMemory,[]) link(onEvent5,5716789:doEvent1,[(166,205)(166,226)]) link(onEvent6,7727094:doStopRead,[]) link(onEvent7,7727094:doSave,[(226,219)(226,226)]) link(onEvent8,6662861:doWork1,[(161,226)(161,260)(123,260)(123,282)]) link(onEvent9,13601262:doClose,[(161,233)(161,126)(11,126)(11,163)]) link(Data1,3915175:Var1,[(125,54)]) } BEGIN_SDK Add(EditMulti,15668120,3,3) { EventCount=9 WorkCount=4 DataCount=1 VarCount=1 Width=850 Height=403 link(doWork1,16082622:doEvent1,[(12,9)(12,160)]) link(doWork2,12007584:doText,[(202,16)(202,41)]) link(doWork3,14404026:doEvent2,[(68,23)(68,202)]) link(doWork4,1254380:doWork1,[(519,30)(519,55)]) link(Var1,14512563:Position,[(9,394)(13,394)]) } Add(Panel,2220040,21,70) { Width=548 Height=101 Align=2 BorderWidth=0 BevelInner=0 BevelWidth=0 Point(doColor) } Add(Memory,10010067,287,301) { Default=Integer(1) } Add(ComboBox,656130,350,273) { Left=85 Top=10 Width=120 Height=21 ReadOnly=0 Point(Index) Point(doSelectString) } Add(BASS_Record,10777576,245,168) { FileName="H:\Музыка\Высоцкий\18_19.WAV" Stream=0 link(onStream,15668120:onEvent1,[(288,174)(288,9)]) link(onError,4888331:doMessage,[]) link(Freg,16676602:Var3,[(251,93)]) } Add(ArrayEnum,3248326,252,217) { link(onItem,656130:doAdd,[(344,223)(344,279)]) link(Array,10777576:Devices,[]) } Add(BASS_Global,11230862,84,133) { link(Freq,16676602:Var1,[(97,93)]) } Add(Hub,16082622,28,154) { OutCount=5 link(onEvent1,10149007:doClear,[(70,160)(70,242)(18,242)(18,223)]) link(onEvent2,11230862:doInit,[(72,167)(72,139)]) link(onEvent3,10777576:doInit,[]) link(onEvent4,3248326:doEnum,[(156,181)(156,223)]) link(onEvent5,1400932:doWork3,[(417,188)]) } Add(Button,12824575,133,133) { Left=5 Top=3 Width=60 Height=18 Caption="Пуск" Data=Integer(0) Point(doEnabled) link(onClick,8408641:doEvent1,[]) } Add(Button,14880746,84,189) { Left=5 Top=30 Width=60 Caption="Стоп" Data=Integer(1) link(onClick,14404026:doEvent1,[]) } Add(ArrayRW,166356,231,308) { link(Array,10777576:Enabled,[(237,210)(251,210)]) link(Index,656130:Index,[(244,291)(333,291)(333,335)(377,335)]) link(Value,10010067:Value,[(251,298)(276,298)(276,343)(293,343)]) } Add(Hub,8408641,175,133) { OutCount=3 link(onEvent1,166356:doWrite,[(224,139)(224,321)]) link(onEvent2,10777576:doStart,[(229,146)(229,188)]) link(onEvent3,2741992:doEvent1,[(212,153)(212,97)]) } Add(Label,12392860,21,112) { Left=315 Height=30 Caption="Длина выборки" AutoSize=1 Alignment=2 } Add(Edit,8386437,35,287) { Left=315 Top=30 Text="44100" DataType=2 link(onEnter,6443709:doWork2,[]) } Add(Label,8156884,98,350) { Left=515 Top=70 Width=25 Height=20 Color=12639424 Caption="1.0" AutoSize=1 Alignment=2 } Add(Edit,13530889,133,35) { Left=210 Top=30 Text="44100" DataType=2 } Add(Message,4888331,294,175) { } Add(GetDataEx,16676602,126,84) { link(Data,13530889:Text,[]) } Add(Label,11446972,77,49) { Left=215 Top=1 Width=79 Height=27 Caption="Частота дискретизации" AutoSize=1 Alignment=2 } Add(Label,12007584,245,35) { Left=264 Top=33 Color=12639424 Caption="0" AutoSize=1 } Add(Hub,9791506,168,294) { link(onEvent1,8386437:doText2,[(210,300)(210,277)(25,277)(25,300)]) link(onEvent2,15668120:onEvent2,[(528,307)(528,16)]) } Add(HubEx,1400932,413,147) { link(onEvent,3421846:doNumber,[(452,160)(452,62)]) } Add(BitsToInt,3421846,476,56) { Count=3 link(onNumber,15668120:onEvent4,[(682,62)(682,30)]) link(Bit1,4381915:Checked,[(482,46)(429,46)(429,147)(356,147)]) link(Bit2,6551226:Checked,[(489,46)(429,46)(429,196)(356,196)]) link(Bit3,9230051:Var1,[(496,46)(429,46)(429,245)(356,245)]) } Add(Hub,14404026,133,189) { InCount=2 link(onEvent1,10777576:doStop,[]) link(onEvent2,2741992:doEvent2,[(172,202)(172,104)]) } Add(Label,1410173,427,203) { Left=335 Top=55 Width=110 Caption="Запись сигнала" AutoSize=1 Alignment=2 } Add(Button,8291147,574,77) { Left=300 Top=75 Width=20 Enabled=1 Caption=">>" Data=Integer(100) Point(doEnabled) link(onClick,2765929:doWork1,[(627,83)]) } Add(Button,3848759,574,182) { Left=205 Top=75 Width=20 Enabled=1 Caption="<<" Data=Integer(-100) Point(doEnabled) link(onClick,1262174:doWork3,[(627,188)]) } Add(Button,12686021,574,147) { Left=225 Top=75 Width=20 Enabled=1 Caption="<" Data=Integer(-10) Point(doEnabled) link(onClick,1262174:doWork2,[(623,153)]) } Add(Button,156877,574,112) { Left=280 Top=75 Width=20 Enabled=1 Caption=">" Data=Integer(10) Point(doEnabled) link(onClick,2765929:doWork2,[(623,118)]) } Add(Button,14582119,567,308) { Left=380 Top=75 Width=70 Enabled=1 Caption="Сохранить" Point(doEnabled) link(onClick,15668120:onEvent7,[(727,314)(727,51)]) } Add(Button,525348,707,336) { Left=380 Top=5 Width=70 Height=25 Font=[MS Sans Serif,12,1,0,1] Caption="Выход" link(onClick,15668120:onEvent9,[(797,342)(797,65)]) } Add(If_else,3284698,84,294) { Type=4 Op2=Integer(444) link(onTrue,10876948:doValue,[]) link(onFalse,10876948:doClear,[(131,307)(117,307)]) } Add(Memory,10876948,126,294) { Default=Integer(444) link(onData,9791506:doEvent1,[]) } Add(Memory,10149007,28,210) { Default=Integer(44100) link(onData,6083533:doEvent1,[(70,216)(70,240)(18,240)(18,251)]) } Add(MathParse,9941385,49,350) { DataCount=1 MathStr="(101-%1)/10" link(onResult,8156884:doText,[]) } Add(Hub,6083533,28,245) { link(onEvent1,8386437:doText,[(70,251)(70,282)(25,282)(25,293)]) link(onEvent2,6443709:doWork1,[(74,258)]) } Add(HubEx,6443709,70,287) { link(onEvent,3284698:doCompare,[]) } Add(Button,10301525,637,322) { Left=515 Top=5 Width=25 Font=[MS Sans Serif,10,1,0,1] Caption="?" link(onClick,15668120:onEvent8,[(762,328)(762,58)]) } Add(Button,13229949,574,217) { Left=245 Top=75 Width=35 Enabled=1 Caption="Всё" Data=Integer(0) Point(doEnabled) link(onClick,779818:doEvent1,[(618,223)(618,195)]) } Add(Label,10535054,483,210) { Top=52 Width=85 Height=27 Caption="Синхронизация - + Выкл" AutoSize=1 Alignment=2 } Add(ChildPanel,9230051,350,203) { link(onEvent1,3099354:doWork3,[(396,209)]) link(onEvent2,3316450:doEvent1,[(432,216)(432,104)]) } BEGIN_SDK Add(EditMulti,7798225,3,3) { EventCount=2 WorkCount=2 VarCount=1 Width=244 Height=207 link(doWork1,15923699:doEnabled,[(24,9)(24,55)]) link(doWork2,6005190:doCompare,[(16,16)(16,97)]) link(Var1,15923699:Selected,[(9,124)(41,124)]) } Add(Panel,248827,42,133) { Left=330 Top=70 Width=48 Height=27 Point(doColor) } Add(RadioButton,15923699,35,42) { Width=45 Height=15 Enabled=1 Caption="Пуск" Point(doEnabled) link(onSelect,4673763:doData,[]) } Add(RadioButton,15105496,182,56) { Top=15 Width=45 Height=15 Selected=0 Caption="Стоп" link(onSelect,4860856:doWork3,[(228,62)]) } Add(Memory,14152543,133,42) { Default=Integer(0) link(onData,4860856:doWork2,[(224,48)]) } Add(DoData,4673763,84,42) { Data=Integer(1) link(onEventData,14152543:doValue,[]) } Add(If_else,6005190,133,91) { Op2=Integer(1) link(onTrue,7798225:onEvent2,[(206,97)(206,16)]) link(Op1,14152543:Value,[]) } Add(HubEx,4860856,224,35) { link(onEvent,7798225:onEvent1,[(240,48)(240,9)]) } END_SDK Add(Label,10156597,483,154) { Left=215 Top=55 Width=100 Caption="Просмотр записи" AutoSize=1 Alignment=2 } Add(HubEx,10142051,644,259) { link(onEvent,15668120:onEvent3,[(709,272)(709,23)]) } Add(DoData,6792061,609,266) { Data=Integer(0) link(onEventData,10142051:doWork3,[(648,272)]) } Add(RadioButton,5253837,567,266) { Left=50 Top=80 Width=15 Selected=0 Caption="" link(onSelect,6792061:doData,[]) } Add(RadioButton,15305645,483,266) { Left=30 Top=80 Width=15 Caption="" link(onSelect,10186035:doData,[]) } Add(RadioButton,10296222,392,266) { Left=10 Top=80 Width=15 Caption="" link(onSelect,2708203:doData,[]) } Add(Label,6880962,350,42) { Left=90 Top=37 Width=95 Caption="Вывод на экран" AutoSize=1 Alignment=2 } Add(CheckBox,4381915,350,105) { Left=95 Top=55 Caption="Левый" link(onCheck,3099354:doWork1,[(396,111)]) } Add(CheckBox,6551226,350,154) { Left=95 Top=75 Width=60 Checked=0 Caption="Правый" link(onCheck,3099354:doWork2,[(392,160)]) } Add(MultiElement,1254380,679,49) { link(onEvent1,13297956:doEvent1,[]) link(Data1,15668120:Data1,[(685,12)(9,12)]) } BEGIN_SDK Add(EditMulti,8460020,3,3) { EventCount=1 WorkCount=1 DataCount=1 VarCount=2 Width=321 Height=256 link(doWork1,12575728:doEvent,[(5,9)(5,118)]) link(Var1,4231213:Result,[(9,240)(132,240)]) link(Var2,4133336:Result,[(16,247)(230,247)]) } Add(IndexToChanel,12575728,21,112) { link(onEvent1,6654002:doData,[(72,118)(72,90)]) link(onEvent2,1238621:doData,[(187,125)(187,90)]) } Add(GetDataEx,15712904,238,119) { link(Data,14407033:Value,[]) } Add(DoData,6654002,84,84) { link(onEventData,8042774:doValue,[]) link(Data,16291784:Var1,[(90,16)]) } Add(Memory,8042774,147,84) { Default=Integer(0) } Add(DoData,1238621,196,84) { link(onEventData,14407033:doValue,[]) link(Data,16291784:Var3,[(202,16)]) } Add(Memory,14407033,245,84) { Default=Integer(0) link(onData,4231213:doOperation,[(286,90)(286,183)(116,183)(116,195)]) } Add(Math,4231213,126,189) { OpType=38 ResultType=0 link(onResult,8327521:doOperation,[]) link(Op1,3460240:Var1,[(132,156)]) link(Op2,15712904:Var1,[(139,128)]) } Add(Math,8327521,175,189) { OpType=1 ResultType=0 link(onResult,4133336:doOperation,[]) link(Op1,3460240:Var3,[(181,156)]) link(Op2,15712904:Var2,[(188,161)(251,161)]) } Add(Math,4133336,224,189) { OpType=33 ResultType=0 link(onResult,8460020:onEvent1,[(290,195)(290,9)]) } Add(GetDataEx,16291784,161,7) { link(Data,8460020:Data1,[(174,7)(9,7)]) } Add(GetDataEx,3460240,140,147) { link(Data,8042774:Value,[]) } END_SDK Add(Hub,13297956,721,49) { link(onEvent1,11583936:doWork1,[(767,55)]) link(onEvent2,6683105:doData,[(762,62)(762,149)(669,149)(669,223)]) } Add(Hub,779818,630,189) { link(onEvent1,11583936:doWork3,[(767,195)]) link(onEvent2,527643:doWork2,[(798,202)]) } Add(HubEx,527643,798,189) { link(onEvent,15668120:onEvent5,[(831,202)(831,37)]) } Add(HubEx,11583936,763,168) { link(onEvent,15668120:onEvent6,[(814,181)(814,44)]) } Add(HubEx,1262174,623,140) { link(onEvent,527643:doWork1,[(802,153)]) } Add(DoData,6683105,679,217) { link(onEventData,527643:doWork3,[(802,223)]) link(Data,1254380:Var1,[]) } Add(HubEx,3099354,392,147) { link(onEvent,1400932:doWork2,[(413,160)]) } Add(Label,8974856,245,350) { Left=515 Top=50 Width=25 Caption="К ус." AutoSize=1 Alignment=2 } Add(Hub,3316450,483,98) { OutCount=6 link(onEvent1,8291147:doEnabled,[(533,104)(533,83)]) link(onEvent2,156877:doEnabled,[(569,111)(569,118)]) link(onEvent3,12686021:doEnabled,[(565,118)(565,153)]) link(onEvent4,3848759:doEnabled,[(558,125)(558,188)]) link(onEvent5,13229949:doEnabled,[(553,132)(553,223)]) link(onEvent6,14582119:doEnabled,[(550,139)(550,314)]) } Add(Hub,2741992,231,91) { InCount=2 OutCount=3 link(onEvent1,12824575:doEnabled,[(270,97)(270,131)(123,131)(123,139)]) link(onEvent2,13205310:doOperation,[(289,104)(289,104)]) link(onEvent3,9230051:doWork2,[(279,111)(279,137)(333,137)(333,216)]) } Add(Math,13205310,294,98) { OpType=1 Op1=1 ResultType=0 link(onResult,9230051:doWork1,[(338,104)(338,209)]) } Add(HubEx,2765929,623,105) { Angle=1 link(onEvent,1262174:doWork1,[(627,123)]) } Add(TrackBar,14512563,7,350) { Left=470 Width=30 Height=100 Max=100 Min=1 TickCount=5 Position=91 Kind=1 link(onPosition,9941385:doCalc,[]) } Add(DoData,2708203,434,266) { Data=Integer(100000) link(onEventData,10142051:doWork1,[(648,272)]) } Add(DoData,10186035,525,266) { Data=Integer(-100000) link(onEventData,10142051:doWork2,[(567,272)]) } END_SDK Add(DoData,2614496,182,80) { link(onEventData,7727094:doHeigth,[(278,86)(278,177)]) link(Data,8249804:Var1,[(188,61)]) } Add(DoData,11754672,217,115) { link(onEventData,7727094:doWidth,[(271,121)(271,184)]) link(Data,10960719:Width,[(223,75)(216,75)]) } Add(Hub,11310168,126,108) { InCount=3 link(onEvent1,2614496:doData,[(170,114)(170,86)]) link(onEvent2,11754672:doData,[]) } Add(GetDataEx,12719150,602,59) { link(Data,11496482:Var3,[(615,61)]) } Add(TrackBar,3819321,7,318) { Width=30 Height=343 Align=1 Max=32768 Min=-32768 TickCount=1024 Kind=1 ThumbLength=10 Point(doColor) link(onPosition,605990:doWork2,[(49,324)]) } Add(Hub,12869014,63,171) { OutCount=3 link(onEvent1,9580284:doWork1,[]) link(onEvent2,11310168:doEvent2,[(110,184)(110,121)]) link(onEvent3,14951765:doHideMaximizeButton,[(105,191)(105,208)(11,208)(11,233)]) } Add(DoData,2180003,462,129) { link(onEventData,11342968:doValue,[]) link(Data,15962803:Value,[(468,119)(454,119)(454,178)(419,178)]) } Add(Message,4038357,490,381) { Message="Записано 2 х 4 410 000 значений!" Caption="Буфер заполнен" } Add(Memory,15962803,413,136) { Default=Integer(0) link(onData,5222854:doCase,[]) } Add(Hub,10356259,182,164) { link(onEvent1,7727094:doPeriod,[]) link(onEvent2,11310168:doEvent3,[(224,177)(224,152)(116,152)(116,128)]) } Add(HubEx,3800743,525,318) { link(onEvent,14505200:doStrCat,[]) } Add(Memory,11342968,504,129) { Default=Integer(0) } Add(StrCat,14505200,539,325) { link(onStrCat,6692970:doSave,[]) link(Str1,6049023:CurrentDir,[]) } Add(If_else,14124604,350,262) { Type=2 Op2=Integer(4) link(onTrue,9580284:doWork2,[(392,268)(392,251)(109,251)(109,184)]) link(onFalse,4948793:doEvent,[]) } Add(Hub,15418465,441,374) { link(onEvent1,8683658:doWork3,[(501,380)]) link(onEvent2,4038357:doMessage,[]) } Add(InlineCode,7727094,301,157) { WorkPoints=#35:doRecData=Потоковые звуковые данные|36:doPeriod=Размер отображаемой выборки|45:doHeigth=Высота картинки (экрана осцилографа)|44:doWidth=Ширина картинки (экрана осцилографа)|21:doSinhr=Синхронизация|27:doMemory=Начать запоминание|29:doRead=Начать воспроизведение|37:doStopRead=Остановить воспроизведение|27:doFreq=Выдать факт скорость|24:doSave=Сохранить в файле| EventPoints=#32:onSignalR=Точка У правого канала|31:onSignalL=Точка У левого канала|24:onStrob=Очистка картинки|39:onVihod=Вывод дополнительной информации|35:onStr=Данные для сохранения в файле| DataPoints=#44:Data1=Коэфициент усиления по Y при просмотре| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|47: _Signal:Array[0..1,0..4410000] of smallint;|20: _Period:integer;|26: _Left,_Right:smallint;|17: _Heigth:Real;|16: _Width:Real;|22: _WidthAbs:integer;|19: _Sinhr:integer;|22: _SinhNow:smallint;|17: _Memory:byte;|20: _MemoryOld:byte;|18: _Read:integer;|22: _StopRead:integer;|25: _StopReadOld:integer;|15: _Save:byte;|14: X:integer;|25: Xold:integer; |14: j:integer;|14: k:integer;|14: t:integer;|14: m:integer;|15: p:integer; |6: |9: public|25: _data_Data:THI_Event;|24: onSignalR:THI_Event;|24: onSignalL:THI_Event;|22: onStrob:THI_Event;|22: onVihod:THI_Event;|20: onStr:THI_Event;|20: Data1:THI_Event;|0:|53: procedure doRecData(var _Data:TData; Index:word);|52: procedure doPeriod(var _Data:TData; Index:word);|52: procedure doHeigth(var _Data:TData; Index:word);|51: procedure doWidth(var _Data:TData; Index:word);|51: procedure doSinhr(var _Data:TData; Index:word);|52: procedure doMemory(var _Data:TData; Index:word);|50: procedure doRead(var _Data:TData; Index:word);|54: procedure doStopRead(var _Data:TData; Index:word);|50: procedure doFreq(var _Data:TData; Index:word);|50: procedure doSave(var _Data:TData; Index:word);|4:end;|0:|14:implementation|0:|32:procedure THiAsmClass.doRecData;|16:var St:PStream; |18: len:cardinal; |14: i:integer;|16: Koef:Real; |5:begin|38: if _Period = 0 then _Period:=444;|50: Koef := (101-ReadInteger(_Data,Data1,10))/10;|44: St := ReadStream(_data,_data_Data,nil);|28: if St = nil then Exit;|29: len := St.Size div 4;|26: for i:=0 to len-1 do|12: begin|44: St.Read(_Left,2);St.Read(_Right,2);|34: _Left:=trunc(_Left*Koef);|36: _Right:=trunc(_Right*Koef);|20: t := t + 1;|28: if j>=_Period then|16: begin|35: _hi_onEvent(onStrob,0);|17: j:= 0|15: end;|100: if ((_SinhNow=0) or (((_SinhNow<>0) and (j<>0)) or (_SinhNow*_Left<_SinhNow*_Sinhr))) then|26: begin |34: X := round(j*_Width); |32: j := j + 1; |27: case _Memory of|22: 0: begin|21: end;|22: 1: begin|34: if X<>Xold then|26: begin|84: _hi_onEvent(onSignalL, round(_Heigth*(32767-_Left))*65536+X);|33: Xold := X;|25: end;|22: end; |22: 2: begin|34: if X<>Xold then|27: begin |85: _hi_onEvent(onSignalR, round(_Heigth*(32767-_Right))*65536+X);|33: Xold := X;|38: end; |21: end;|22: 3: begin|34: if X<>Xold then|27: begin |85: _hi_onEvent(onSignalR, round(_Heigth*(32767-_Right))*65536+X);|84: _hi_onEvent(onSignalL, round(_Heigth*(32767-_Left))*65536+X);|33: Xold := X;|41: end; |19: |21: end;|22: 4: begin|40: _Signal[0,k]:= _Left;|41: _Signal[1,k]:= _Right;|30: k := k + 1;|39: if k>=4410000 then|28: begin|35: k:=4409999;|47: _hi_onEvent(onVihod,1);|40: end; |21: end;|22: 5: begin|34: if X<>Xold then|26: begin|84: _hi_onEvent(onSignalL, round(_Heigth*(32767-_Left))*65536+X);|33: Xold := X;|38: end; |40: _Signal[0,k]:= _Left;|41: _Signal[1,k]:= _Right;|30: k := k + 1;|39: if k>=4410000 then|28: begin|35: k:=4409999;|47: _hi_onEvent(onVihod,1);|40: end; |21: end;|22: 6: begin|34: if X<>Xold then|27: begin |85: _hi_onEvent(onSignalR, round(_Heigth*(32767-_Right))*65536+X);|33: Xold := X;|25: end;|40: _Signal[0,k]:= _Left;|41: _Signal[1,k]:= _Right;|30: k := k + 1;|39: if k>=4410000 then|28: begin|35: k:=4409999;|47: _hi_onEvent(onVihod,1);|60: end; |21: end;|22: 7: begin|34: if X<>Xold then|27: begin |85: _hi_onEvent(onSignalR, round(_Heigth*(32767-_Right))*65536+X);|84: _hi_onEvent(onSignalL, round(_Heigth*(32767-_Left))*65536+X);|33: Xold := X;|38: end; |40: _Signal[0,k]:= _Left;|41: _Signal[1,k]:= _Right;|30: k := k + 1;|39: if k>=4410000 then|28: begin|35: k:=4409999;|47: _hi_onEvent(onVihod,1);|40: end; |33: end; |18: else|22: begin|21: end;|20: end; |15: end;|11: end;|4:end;|0:|31:procedure THiAsmClass.doPeriod;|6: begin|29: _Period:= toInteger(_data);|5: end;|1: |31:procedure THiAsmClass.doHeigth;|6: begin|35: _Heigth:= toInteger(_data)/65536;|5: end;|1: |30:procedure THiAsmClass.doWidth;|6: begin|32: _WidthAbs := toInteger(_data);|30: _Width:= _WidthAbs/_Period; |5: end;|0:|30:procedure THiAsmClass.doSinhr;|6: begin|28: _Sinhr:= toInteger(_data);|25: if _Sinhr<-50000 then|11: begin|23: _SinhNow:=(-1);|11: end |8: else|15: begin |28: if _Sinhr>50000 then|15: begin|24: _SinhNow:=1;|13: end|12: else|15: begin|22: _SinhNow:=0;|14: end;|11: end; |42: _Sinhr:=_Sinhr - _SinhNow*100000; |5: end;|0:|31:procedure THiAsmClass.doMemory;|6: begin|22: _MemoryOld:=_Memory;|29: _Memory:= toInteger(_data);|44: if ((_Memory>3) and (_MemoryOld<4)) then|36: begin {Начинаем запоминание}|13: k:=0;|9: end|8: else|14: begin |47: if ((_Memory<4) and (_MemoryOld>3)) then|42: begin {Заканчиваем запоминание}|34: _hi_onEvent(onVihod,0);|19: end; |18: end; |5: end;|0:|29:procedure THiAsmClass.doFreq;|6: begin|26: _hi_onEvent(onVihod,t);|10: t := 0;|5: end;|1: |29:procedure THiAsmClass.doRead;|5: var|13: n:integer;|13: Koef:Real;|9: begin|31: _Read:= toInteger(_data);|62: Koef := (101-ReadInteger(_Data,Data1,10))/10; |57: if (((_Read=0) and (_StopRead=0)) or (p=0)) then |15: begin|17: m:=0;|17: p:=k;|14: end |12: else|15: begin|34: if _StopReadOld=0 then|19: begin|50: m := m - round(_Read*p/_WidthAbs);|35: if m<0 then m:=0; |37: if p<444 then p:=444;|39: if m>(k-p) then m:=k-p;|17: end|16: else|21: begin |50: m := m + round(_Read*p/_WidthAbs);|33: if m<0 then m:=0;|52: p := round(_StopRead*p/_WidthAbs); |37: if p<430 then p:=430;|39: if m>(k-p) then m:=k-p;|33: _StopReadOld:=0; |20: end; |20: end; |29: _hi_onEvent(onVihod,0);|49: _Width :=_WidthAbs/p; |26: for n:= 0 to p do|16: begin|34: X := round(n*_Width);|28: case _Memory of|23: 1: begin|34: if X<>Xold then|41: begin |105: _hi_onEvent(onSignalL, round(_Heigth*(32767-_Sinhr-Koef*_Signal[0,n+m]))*65536+X);|31: Xold:=X;|47: _hi_onEvent(onStr,Koef);|42: end |38: end; |23: 2: begin|34: if X<>Xold then|41: begin |105: _hi_onEvent(onSignalR, round(_Heigth*(32767-_Sinhr-Koef*_Signal[1,n+m]))*65536+X);|31: Xold:=X;|63: end |22: end;|23: 3: begin|34: if X<>Xold then|41: begin |105: _hi_onEvent(onSignalR, round(_Heigth*(32767-_Sinhr-Koef*_Signal[1,n+m]))*65536+X);|105: _hi_onEvent(onSignalL, round(_Heigth*(32767-_Sinhr-Koef*_Signal[0,n+m]))*65536+X);|31: Xold:=X;|45: end |22: end;|19: else|23: begin|42: end; |22: end; |21: end; |0:|29: _hi_onEvent(onVihod,p);|37: _Width:= _WidthAbs/_Period; |8: end;|0:|33:procedure THiAsmClass.doStopRead;|6: begin|20: _StopReadOld := 1;|32: _StopRead := toInteger(_data);|7: end; |1: |29:procedure THiAsmClass.doSave;|6: var|13: n:integer;|6: begin|21: for n:=0 to k do|12: begin|40: _hi_onEvent(onStr,_Signal[0,n]);|13: end; |26: _hi_onEvent(onVihod,2);|26: _hi_onEvent(onVihod,4);|21: for n:=0 to k do|12: begin|40: _hi_onEvent(onStr,_Signal[1,n]);|13: end; |26: _hi_onEvent(onVihod,3);|31: _hi_onEvent(onVihod,4); |8: end; |4:end.| link(onSignalR,7113199:doEvent1,[(345,163)(345,128)]) link(onSignalL,8979386:doEvent1,[(345,170)(345,184)]) link(onStrob,8613397:doEvent1,[(343,177)(343,82)(137,82)(137,-12)]) link(onVihod,14124604:doCompare,[(341,184)(341,268)]) link(onStr,6692970:doAdd,[(467,191)(467,296)]) link(Data1,9580284:Var1,[(307,143)(277,143)(277,247)(125,247)]) } Add(IndexToChanel,4948793,392,269) { Count=5 Data=Integer(1) link(onEvent1,8683658:doWork2,[(497,275)]) link(onEvent2,15418465:doEvent1,[(432,282)(432,380)]) link(onEvent3,3907614:doData,[]) link(onEvent4,7689406:doData,[(436,296)(436,331)]) link(onEvent5,6692970:doClear,[]) } Add(HubEx,2891056,490,227) { link(onEvent,10906784:doOperation,[]) } Add(Case,9535924,553,192) { Value=Real(0) link(onNextCase,11483946:doDraw,[]) } Add(Case,5222854,553,136) { Value=Real(0) link(onNextCase,4715891:doDraw,[]) } Add(HubEx,8683658,497,262) { Angle=3 link(onEvent,9580284:doWork3,[(501,251)(109,251)(109,191)]) } Add(StrList,6692970,602,290) { } Add(Dir,6049023,539,276) { } Add(DoData,3907614,441,283) { Data=String(SoundL.txt) link(onEventData,3800743:doWork1,[(529,289)]) } Add(DoData,7689406,441,325) { Data=String(SoundR.txt) link(onEventData,3800743:doWork2,[(525,331)]) } Add(Hub,5716789,182,220) { OutCount=4 link(onEvent1,8613397:doEvent2,[(228,226)(228,154)(137,154)(137,-5)]) link(onEvent2,10960719:doClear,[(279,233)(279,43)(193,43)(193,16)]) link(onEvent3,6948450:doValue,[]) link(onEvent4,5585134:doTimer,[(224,247)(224,267)(172,267)(172,282)]) } Add(Timer,5585134,182,276) { Interval=100 Enable=1 AutoStop=1 link(onTimer,10647623:doData,[]) } Add(Hub,8613397,147,-18) { InCount=2 link(onEvent1,15962803:doClear,[(399,-12)(399,149)]) link(onEvent2,5581331:doClear,[(398,-5)(398,205)]) } Add(Memory,6948450,231,234) { } Add(DoData,10647623,231,276) { link(onEventData,7727094:doRead,[(279,282)(279,205)]) link(Data,6948450:Value,[]) } Add(GetDataEx,8249804,217,52) { link(Data,10960719:Height,[(230,46)(223,46)]) } Add(Img_Line,4715891,609,136) { Color=255 DrawSource=1 link(Bitmap,12719150:Var2,[]) link(Point1,11342968:Value,[(622,128)(552,128)(552,173)(510,173)]) } Add(Hub,7113199,357,122) { OutCount=3 link(onEvent1,2891056:doWork1,[(494,128)]) link(onEvent2,2180003:doData,[]) link(onEvent3,15962803:doValue,[(401,142)(401,142)]) } Add(DoData,8140904,462,185) { link(onEventData,13523726:doValue,[]) link(Data,5581331:Value,[(468,181)(453,181)(453,233)(419,233)]) } Add(Memory,5581331,413,192) { Default=Integer(0) link(onData,9535924:doCase,[]) } Add(Memory,13523726,504,185) { } Add(Img_Line,11483946,595,192) { Color=16711680 DrawSource=1 link(Bitmap,12719150:Var1,[(601,68)]) link(Point1,13523726:Value,[(608,182)(566,182)(566,227)(510,227)]) } Add(Hub,8979386,357,178) { OutCount=3 link(onEvent1,2891056:doWork2,[(404,184)(404,240)]) link(onEvent2,8140904:doData,[]) link(onEvent3,5581331:doValue,[]) } Add(GetDataEx,11496482,532,52) { link(Data,10960719:Handle,[(545,46)(237,46)]) } Add(Math,12349221,77,318) { OpType=1 link(onResult,7727094:doSinhr,[(274,324)(274,191)]) link(Op1,2117885:Value,[]) link(Op2,3819321:Position,[(90,308)(58,308)(58,360)(13,360)]) } Add(Memory,2117885,77,269) { link(onData,605990:doWork1,[(120,275)(120,308)(53,308)]) } Add(HubEx,605990,49,311) { link(onEvent,12349221:doOperation,[]) } Add(Img_Line,3722541,658,171) { Color=255 DrawSource=1 link(Bitmap,12719150:Var3,[(664,68)]) link(Point1,15320364:Point,[]) link(Point2,3915175:Var2,[(678,115)(237,115)]) } Add(ChanelToIndex,3322734,266,10) { link(onIndex,16745605:doEvent1,[]) } Add(Hub,16745605,308,10) { link(onEvent1,3722541:doDraw,[(499,16)(499,177)]) link(onEvent2,9580284:doWork4,[(349,23)(349,71)(109,71)(109,198)]) } Add(GetDataEx,3915175,224,45) { link(Data,10960719:MouseX,[(237,42)(230,42)]) } Add(PointXY,15320364,665,87) { link(X,3915175:Var3,[(671,54)]) link(Y,8249804:Var2,[(678,73)(230,73)]) } Add(ChildForm,6662861,133,276) { FirstUsage=0 } BEGIN_SDK Add(EditMulti,8396777,39,3) { WorkCount=1 Width=265 link(doWork1,12927962:doNext,[(48,9)(48,41)]) } Add(MainForm,7401065,210,63) { Left=35 Top=10 Visible=1 Point(doVisible) Point(doLeft) Point(Close) link(onCreate,8547893:doOperation,[(250,104)(250,168)(144,168)(144,104)]) link(Close,10098499:GetData,[(216,58)(216,58)]) } Add(Memo,15127166,56,77) { Left=70 Top=90 Align=5 Strings=#136:Программа сделана в среде HiAsm "http://hiasm.hexshock.com" и использует библиотеку BASS.dll "http://hiasm.hexshock.com/down/bass.dll".|0:|36: Работа с осцилографом|11: 1. Запуск|162: 1.1 При запуске программа проверяет наличие и занятость звуковой карты; потдерживаемые картой источники сигнала перечисляются в выпадающем списке для выбора.|154: 1.2 После выбора источника устанавливается частота дискретизации в Гц (см. документацию на звуковую карту - некоторые не поддерживают любые частоты).|199: 1.3 Теперь нужно установить длину выборки, т. е. количество дискретных значений отражающихся на экране (соответствует величине развёртки) - ввод нового значения осуществляется при нажатии Enter.|31: 1.4 Нажимаем кнопку "Пуск"|20: 1.5 Ограничения|144: 1.5.1 Частоту дискретизации и Длину выборки можно изменять исключительно при остановленной работе - только после нажатия кнопки "Стоп".|62: 1.5.2 Минимальное значение Длины выборки - 444 точки.|21: 2. Просмотр сигнала|105: 2.1 Отключить и включить вывод каналов на экран можно флажками (птичками) в соответствующих окошках.|134: 2.2 Можно включить синхронизацию и настроить её уровень трекбаром (слева от экрана). Синхронизация производится по левому каналу!|142: 2.3 Можно именить размер окна соответственно и зкрана осцилографа растягивая или сжимая окно мышкой (кнопка "Максимизировать" отключена).|20: 2.4 Ограничения|578: 2.4.1 На зеленоватой Label у поля "Частота дискретизации" показывается количество фактически выведенных на экран значений сигнала в секунду. Если эта цифра равна частоте дискретизации - компьютер успевает обработать весь сигнал. Если она (цифра) начинает изменяться, то меньше, то больше частоты дискретизации - быстродействие компьютера на грани необходимого, а если скорость обработки стабильно меньше - начинается накапливание необработанного сигнала в буфере и зависание программы, а при переполнении буфера - вылетание программы с сообщением о неустранимой ошибке.|55: 2.4.2 Для увеличения скорости обработки можно:|164: 2.4.2.1 Увеличить длину выборки, при этом на экран выводятся не все сигналы и уменьшается количество самых медленных операций - вывод линий на экран.|131: 2.4.2.2 Отключить вывод на экран одного или обеих каналов (правда последнее оправдано только при включенной записи).|55: 2.4.2.3 Уменьшить частоту дискретизации.|19: 3. Запись сигнала|125: 3.1 Для записи просматриваемого сигнала в ОЗУ выбрать переключатель "Пуск", для окончания записи - переключатель "Стоп"|93: 3.2 Значения сигнала запоминаются в двухбайтном целочисленном формате (-32767_0_+32767).|124: 3.3 Длина записи ограничена 2 х 4410000 значений - сто секунд при частоте дискретизации 44100 Гц и занимают ~18 мБ ОЗУ.|20: 4. Просмотр записи|87: 4.1 Просмотр записи надо начинать кнопкой "Всё" - она выводит на экран всю запись.|284: 4.2 Для просмотра участка записи выбрать мышкой начало, нажать любую кнопку и, не отпуская кнопки, протянуть до окончания выбранного участка записи и отпустить кнопку. Эта часть записи отразится на зкране, длина её указывается на зеленоватой Label у поля "Частота дискретизации".|128: 4.3 Если на экране часть записи, то перемещаться по ней можно кнопками "<" ">" по 10 экранных пикселей, "<<" ">>" - по 100.|74: 4.4 Сдвигать запись вверх-вниз можно используя трекбар синхронизации.|83: 4.5 Можно изменить видимую амплитуду трекбаром "К ус." (Коэффициент усиления).|117: 4.6 Изменения по пп 4.4 и 4.5 проявляются на следующем экране, т. е. после нажатия кнопок перемещения по записи.|235: 5. Для сохранения записи нажать кнопку "Сохранить" - запись сохраняется в двух файлах "SoundL.txt" и "SoundR.txt" в папке, откуда стартовала программа. Эти файлы можно проанализировать, например, в Ecxel в более спокойной обстановке.|0:|0:|33:Автор: Леонид "alina3@com2com.ru"| ScrollBars=2 ReadOnly=0 } Add(EventFromData,10098499,210,21) { link(onEvent,12927962:doReset,[(252,27)(252,11)(46,11)(46,55)]) } Add(Counter,12927962,56,35) { Max=1 link(onNext,7401065:doVisible,[(149,41)(149,97)]) } Add(Screen,7435681,154,49) { } Add(Math,8547893,154,98) { OpType=1 Op2=410 ResultType=0 link(onResult,7401065:doLeft,[]) link(Op1,7435681:Width,[]) } END_SDK Add(SysMenu,14951765,21,213) { link(Handle,13601262:Handle,[(27,192)(27,192)]) } Add(Img_Line,16365948,602,234) { Color=32768 Size=3 Point2AsOffset=0 DrawSource=1 Point(Color) link(Bitmap,11496482:Var2,[(608,132)(545,132)]) link(Point2,3283948:Point,[]) } Add(Math,10906784,518,234) { OpType=8 Op2=65536 link(onResult,11774805:doOperation,[]) } Add(PointXY,3283948,616,87) { link(Y,8249804:Var3,[(629,61)]) } Add(Math,11774805,560,234) { Op2=2 link(onResult,16365948:doDraw,[]) } Add(Timer,14119530,231,332) { link(onTimer,7727094:doFreq,[(282,338)(282,219)]) }