#pragma rtGlobals=1 // Use modern global access method. #include "Bsound" Menu "Chart" "Display/D", ChGraphData() "Save/E", ChSaveFiles() "-" "Chart file format...", ChPromptFileFormat() "-" "Chart Settings", ChartSettings() "Spectrogram Settings/4", SpectrogramPanel() "Signal and DT names", ChannelNames() "File Sorting paths", ChSortSoundPanel() "Cursor Display", ChCursorDisplay() "-" Submenu "Convert" "Signal file to BSF file", ConvertSignalToBSF() "BSF file to Signal file", ConvertBSFtoSignal() //"BSF file to Wav files", "DT file to BSF file", ConvertDTtoBSF() "DT file to Signal files", ConvertDTtoSignal() //"DT file to Wav files", //"Signal files to Wav files", "-" "All Signal files to BSF files", ConvertAllSignalsToBSFs() //"All Signal files to Wav files", "All BSF files to Signal files", ConvertAllBSFsToSignals() //"All BSF files to Wav files", "All DT files to BSF files", ConvertAllDTstoBSFs() "All DT files to Signal files", ConvertAllDTstoSignalFiles() //"All DT files to Wav files", //"All Signal files to Wav files", "-" "ADInst. Chart to BSF", ConvertADInstChartToBSF() "ADInst. Chart to WAV", ConvertADInstChartToWAV() End Submenu "Data Log" "=0;i-=1) if(!stringmatch(Str[i], " " )) return Str[0,i] endif endfor End //------------------------------------------------------------------------------------- Function ReadPreferencesFile(SelectFile) Variable SelectFile String fileNameStr Variable refNum, fileExists if(SelectFile) Open/R/Z=0/M="Select a Settings file" refNum as "" if(V_Flag==-1) return 0 endif String FilePathAndName=S_fileName String FileName = StringFromList(ItemsInList(FilePathAndName,":")-1, FilePathAndName, ":") String FilePath=RemoveFromList(FileName, FilePathAndName, ":") FilePath=FilePath[0,strlen(FilePath)-2] fileExists=1 fileNameStr=FilePathAndName NewPath/O/C/Q/Z IgorPrefs , FilePath else Pathinfo Igor fileNameStr=S_path+"BSound Preferences:Chart Preferences" String pathStr=S_path+"BSound Preferences" Open/R/Z=1/P=Igor refNum as fileNameStr fileExists=refNum PathInfo IgorPrefs if(V_Flag==0) NewPath/O/C/Q/Z IgorPrefs , pathStr endif endif if(fileExists==0) //DoAlert 0, "Chart Preferences file not found. Choose \"Save preferences\" from the Preferences submenu to avoid this message." return 0 endif // Read Preferences Open/R/P=IgorPrefs/Z=2 refNum as fileNameStr FSetPos refNum, 0 String FileType=""; FileType=PadString(FileType, 12, 0 ) FBinRead/B=3 refNum, FileType String VersionNumber=""; VersionNumber=PadString(VersionNumber, 8, 0 ) FBinRead/B=3 refNum, VersionNumber String FileNote=""; FileNote=PadString(FileNote, 32, 0 ) FBinRead/B=3 refNum, FileNote String TempStr="" String dfSav= GetDataFolder(1) // Save data folder String theDF= "root:ChartGlobals" NewDataFolder/O/S $theDF Variable i TempStr="" for(i=1;i<=6;i+=1) TempStr=PadString(TempStr, 4, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G $"FileWav"+num2str(i)=TempStr endfor TempStr="" for(i=1;i<=6;i+=1) TempStr=PadString(TempStr, 32, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G $"WavName"+num2str(i)=TempStr endfor TempStr="" for(i=1;i<=6;i+=1) TempStr=PadString(TempStr, 32, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G $"SignalChName"+num2str(i)=TempStr endfor // Chart Variables FSetPos refNum, 1024 Variable tempVar for(i=1;i<=6;i+=1) NVAR PlotChX=$"root:ChartGlobals:PlotCh"+num2str(i) FBinRead/B=3/F=1 refNum, PlotChX endfor for(i=1;i<=6;i+=1) NVAR ZeroLineChX=$"root:ChartGlobals:ZeroLineCh"+num2str(i) FBinRead/B=3/F=1 refNum, ZeroLineChX endfor for(i=1;i<=6;i+=1) NVAR MinChX=$"root:ChartGlobals:MinCh"+num2str(i) FBinRead/B=3/F=1 refNum, MinChX endfor for(i=1;i<=6;i+=1) NVAR ModChX=$"root:ChartGlobals:ModCh"+num2str(i) FBinRead/B=3/F=1 refNum, ModChX endfor for(i=1;i<=6;i+=1) NVAR ScaleChX=$"root:ChartGlobals:ScaleCh"+num2str(i) FBinRead/B=3/F=1 refNum, ScaleChX endfor for(i=1;i<=6;i+=1) NVAR ppVChX=$"root:ChartGlobals:ppVCh"+num2str(i) FBinRead/B=3/F=5 refNum, ppVChX endfor for(i=1;i<=6;i+=1) NVAR PosYChX=$"root:ChartGlobals:PosYCh"+num2str(i) FBinRead/B=3/F=1 refNum, PosYChX endfor for(i=1;i<=6;i+=1) NVAR HideYChX=$"root:ChartGlobals:HideYCh"+num2str(i) FBinRead/B=3/F=1 refNum, HideYChX endfor NVAR FunctionValue=root:ChartGlobals:FunctionValue; FBinRead/B=3/F=5 refNum, FunctionValue NVAR ChSel=root:ChartGlobals:ChSel; FBinRead/B=3/F=2 refNum, ChSel NVAR SPGWave=root:ChartGlobals:SPGWave; FBinRead/B=3/F=2 refNum, SPGWave NVAR AutoSpectrogram=root:ChartGlobals:AutoSpectrogram; FBinRead/B=3/F=1 refNum, AutoSpectrogram NVAR FirstZ=root:ChartGlobals:FirstZ; FBinRead/B=3/F=5 refNum, FirstZ NVAR LastZ=root:ChartGlobals:LastZ; FBinRead/B=3/F=5 refNum, LastZ NVAR ppV=root:ChartGlobals:ppV; FBinRead/B=3/F=5 refNum, ppV NVAR DrawCalLine=root:ChartGlobals:DrawCalLine; FBinRead/B=3/F=1 refNum, DrawCalLine NVAR TimeAxisDur=root:ChartGlobals:TimeAxisDur; FBinRead/B=3/F=5 refNum, TimeAxisDur NVAR MinSpgkHz=root:ChartGlobals:MinSpgkHz; FBinRead/B=3/F=5 refNum, MinSpgkHz NVAR MaxSpgkHz=root:ChartGlobals:MaxSpgkHz; FBinRead/B=3/F=5 refNum, MaxSpgkHz NVAR logHz=root:ChartGlobals:logHz; FBinRead/B=3/F=1 refNum, logHz NVAR GridLines=root:ChartGlobals:GridLines; FBinRead/B=3/F=1 refNum, GridLines NVAR UseBriansTicks=root:ChartGlobals:UseBriansTicks; FBinRead/B=3/F=1 refNum, UseBriansTicks NVAR PlotSpectrum=root:ChartGlobals:PlotSpectrum; FBinRead/B=3/F=1 refNum, PlotSpectrum NVAR PlotRMS=root:ChartGlobals:PlotRMS; FBinRead/B=3/F=1 refNum, PlotRMS NVAR PlotkHzPeaks=root:ChartGlobals:PlotkHzPeaks; FBinRead/B=3/F=1 refNum, PlotkHzPeaks NVAR GraphHeight=root:ChartGlobals:GraphHeight; FBinRead/B=3/F=5 refNum, GraphHeight NVAR GraphWidth=root:ChartGlobals:GraphWidth; FBinRead/B=3/F=5 refNum, GraphWidth NVAR SPGProportion=root:ChartGlobals:SPGProportion; FBinRead/B=3/F=5 refNum, SPGProportion NVAR WindowLeft=root:ChartGlobals:WindowLeft; FBinRead/B=3/F=5 refNum, WindowLeft NVAR WindowTop=root:ChartGlobals:WindowTop; FBinRead/B=3/F=5 refNum, WindowTop NVAR DataLog=root:ChartGlobals:DataLog; FBinRead/B=3/F=1 refNum, DataLog NVAR FileSortDialog=root:ChartGlobals:FileSortDialog; FBinRead/B=3/F=1 refNum, FileSortDialog NVAR FileSort=root:ChartGlobals:FileSort; FBinRead/B=3/F=1 refNum, FileSort NVAR AppendNameAndPath=root:ChartGlobals:AppendNameAndPath; FBinRead/B=3/F=1 refNum, AppendNameAndPath NVAR OneDisplayWindow=root:ChartGlobals:OneDisplayWindow; FBinRead/B=3/F=1 refNum, OneDisplayWindow NVAR FileFormat=root:ChartGlobals:FileFormat; FBinRead/B=3/F=1 refNum, FileFormat NVAR ScaleDT=root:ChartGlobals:ScaleDT; FBinRead/B=3/F=5 refNum, ScaleDT NVAR SRateDT=root:ChartGlobals:SRateDT; FBinRead/B=3/F=5 refNum, SRateDT NVAR NumDTChannels=root:ChartGlobals:NumDTChannels; FBinRead/B=3/F=5 refNum, NumDTChannels TempStr="" for(i=1;i<=9;i+=1) TempStr=PadString(TempStr, 32, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G $"SortButton"+num2str(i)=TempStr endfor TempStr="" for(i=1;i<=9;i+=1) TempStr=PadString(TempStr, 256, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G $"SortPath"+num2str(i)=TempStr endfor TempStr="" for(i=1;i<=6;i+=1) TempStr=PadString(TempStr, 32, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G $"LogNote"+num2str(i)=TempStr endfor // Load BSound Spectrogram Variables NewDataFolder/O/S root:BSoundGlobals Variable/G FFT_size; FBinRead/B=3/F=5 refNum, FFT_size Variable/G FrameLength; FBinRead/B=3/F=5 refNum, FrameLength Variable/G overlap; FBinRead/B=3/F=5 refNum, overlap Variable/G SmoothSpectrogram; FBinRead/B=3/F=5 refNum, SmoothSpectrogram Variable/G Threshold; FBinRead/B=3/F=5 refNum, Threshold Variable/G PlotDerivative; FBinRead/B=3/F=1 refNum, PlotDerivative Variable/G MaxGenerationHz; FBinRead/B=3/F=5 refNum, MaxGenerationHz Variable/G WindowType; FBinRead/B=3/F=1 refNum, WindowType Variable/G reverseColor; FBinRead/B=3/F=1 refNum, reverseColor TempStr=PadString(TempStr, 64, 0 ) FBinRead/B=3 refNum, TempStr; UnPadString(TempStr); String/G SpectrogramColor=TempStr Close refNum // reset IgorPref path if file saved elsewhere Pathinfo Igor NewPath/O/Q/Z IgorPrefs, S_path+"BSound Preferences" SetDataFolder dfSav End //------------------------------------------------------------------------------------- Function WritePreferencesFile(SelectFile) // Write Preferences Variable SelectFile String fileNameStr, pathStr Variable refNum if(SelectFile) Open/Z=2/M="Save Settings to a file" refNum as "Chart Preferences" if(V_Flag==-1) return 0 endif Close refNum String FilePathAndName=S_fileName String FileName = StringFromList(ItemsInList(FilePathAndName,":")-1, FilePathAndName, ":") String FilePath=RemoveFromList(FileName, FilePathAndName, ":") FilePath=FilePath[0,strlen(FilePath)-2] NewPath/O/C/Q/Z IgorPrefs, FilePath // set temporarily for saving file fileNameStr=FilePathAndName else Pathinfo Igor fileNameStr=S_path+"BSound Preferences:Chart Preferences" pathStr=S_path+"BSound Preferences" Open/R/Z=1/P=Igor refNum as fileNameStr Variable fileExists=refNum PathInfo IgorPrefs if(V_Flag==0) NewPath/O/C/Q/Z IgorPrefs, pathStr endif if(fileExists==0) DoAlert 1, "Save current settings?" if(V_flag==2) // if No return 0 endif endif endif refNum=0 // Write Preferences Open/P=IgorPrefs/Z=2 refNum as fileNameStr if(V_Flag==-1) Close refNum return 0 endif FSetPos refNum, 0 String FileType="ChartPrefs"; FileType=PadString(FileType, 12, 0 ) FBinWrite/B=3 refNum, FileType String VersionNumber="1.0"; VersionNumber=PadString(VersionNumber, 8, 0 ) FBinWrite/B=3 refNum, VersionNumber String FileNote="Note"; FileNote=PadString(FileNote, 32, 0 ) FBinWrite/B=3 refNum, FileNote Variable i String TempStr // Chart Strings for(i=1;i<=6;i+=1) SVAR FileWaveX=$"root:ChartGlobals:FileWav"+num2str(i); TempStr=FileWaveX; TempStr=TempStr[0,3] TempStr=PadString(TempStr, 4, 0 ); FBinWrite/B=3 refNum, TempStr endfor for(i=1;i<=6;i+=1) SVAR WavNameX=$"root:ChartGlobals:WavName"+num2str(i); TempStr=WavNameX; TempStr=TempStr[0,31] TempStr=PadString(TempStr, 32, 0 ); FBinWrite/B=3 refNum, TempStr endfor for(i=1;i<=6;i+=1) SVAR SignalChNameX=$"root:ChartGlobals:SignalChName"+num2str(i); TempStr=SignalChNameX; TempStr=TempStr[0,31] TempStr=PadString(TempStr, 32, 0 ); FBinWrite/B=3 refNum, TempStr endfor SVAR DSPFunction=root:ChartGlobals:DSPFunction; TempStr=DSPFunction; TempStr=TempStr[0,31]; TempStr=PadString(TempStr, 32, 0 ); FBinWrite/B=3 refNum, TempStr SVAR FileExtension=root:ChartGlobals:FileExtension; TempStr=FileExtension; TempStr=TempStr[0,31]; TempStr=PadString(TempStr, 8, 0 ); FBinWrite/B=3 refNum, TempStr // Chart Variables TempStr=PadString(TempStr, 1024, 0 ) FBinWrite/B=3 refNum, TempStr FSetPos refNum, 1024 Variable tempVar for(i=1;i<=6;i+=1) NVAR PlotChX=$"root:ChartGlobals:PlotCh"+num2str(i); FBinWrite/B=3/F=1 refNum, PlotChX endfor for(i=1;i<=6;i+=1) NVAR ZeroLineChX=$"root:ChartGlobals:ZeroLineCh"+num2str(i); FBinWrite/B=3/F=1 refNum, ZeroLineChX endfor for(i=1;i<=6;i+=1) NVAR MinChX=$"root:ChartGlobals:MinCh"+num2str(i); FBinWrite/B=3/F=1 refNum, MinChX endfor for(i=1;i<=6;i+=1) NVAR ModChX=$"root:ChartGlobals:ModCh"+num2str(i); FBinWrite/B=3/F=1 refNum, ModChX endfor for(i=1;i<=6;i+=1) NVAR ScaleChX=$"root:ChartGlobals:ScaleCh"+num2str(i); FBinWrite/B=3/F=1 refNum, ScaleChX endfor for(i=1;i<=6;i+=1) NVAR ppVChX=$"root:ChartGlobals:ppVCh"+num2str(i); FBinWrite/B=3/F=5 refNum, ppVChX endfor for(i=1;i<=6;i+=1) NVAR PosYChX=$"root:ChartGlobals:PosYCh"+num2str(i); FBinWrite/B=3/F=1 refNum, PosYChX endfor for(i=1;i<=6;i+=1) NVAR HideYChX=$"root:ChartGlobals:HideYCh"+num2str(i); FBinWrite/B=3/F=1 refNum, HideYChX endfor NVAR FunctionValue=root:ChartGlobals:FunctionValue; FBinWrite/B=3/F=5 refNum, FunctionValue NVAR ChSel=root:ChartGlobals:ChSel; FBinWrite/B=3/F=2 refNum, ChSel NVAR SPGWave=root:ChartGlobals:SPGWave; FBinWrite/B=3/F=2 refNum, SPGWave NVAR AutoSpectrogram=root:ChartGlobals:AutoSpectrogram; FBinWrite/B=3/F=1 refNum, AutoSpectrogram NVAR FirstZ=root:ChartGlobals:FirstZ; FBinWrite/B=3/F=5 refNum, FirstZ NVAR LastZ=root:ChartGlobals:LastZ; FBinWrite/B=3/F=5 refNum, LastZ NVAR ppV=root:ChartGlobals:ppV; FBinWrite/B=3/F=5 refNum, ppV NVAR DrawCalLine=root:ChartGlobals:DrawCalLine; FBinWrite/B=3/F=1 refNum, DrawCalLine NVAR TimeAxisDur=root:ChartGlobals:TimeAxisDur; FBinWrite/B=3/F=5 refNum, TimeAxisDur NVAR MinSpgkHz=root:ChartGlobals:MinSpgkHz; FBinWrite/B=3/F=5 refNum, MinSpgkHz NVAR MaxSpgkHz=root:ChartGlobals:MaxSpgkHz; FBinWrite/B=3/F=5 refNum, MaxSpgkHz NVAR logHz=root:ChartGlobals:logHz; FBinWrite/B=3/F=1 refNum, logHz NVAR GridLines=root:ChartGlobals:GridLines; FBinWrite/B=3/F=1 refNum, GridLines NVAR UseBriansTicks=root:ChartGlobals:UseBriansTicks; FBinWrite/B=3/F=1 refNum, UseBriansTicks NVAR PlotSpectrum=root:ChartGlobals:PlotSpectrum; FBinWrite/B=3/F=1 refNum, PlotSpectrum NVAR PlotRMS=root:ChartGlobals:PlotRMS; FBinWrite/B=3/F=1 refNum, PlotRMS NVAR PlotkHzPeaks=root:ChartGlobals:PlotkHzPeaks; FBinWrite/B=3/F=1 refNum, PlotkHzPeaks NVAR GraphHeight=root:ChartGlobals:GraphHeight; FBinWrite/B=3/F=5 refNum, GraphHeight NVAR GraphWidth=root:ChartGlobals:GraphWidth; FBinWrite/B=3/F=5 refNum, GraphWidth NVAR SPGProportion=root:ChartGlobals:SPGProportion; FBinWrite/B=3/F=5 refNum, SPGProportion NVAR WindowLeft=root:ChartGlobals:WindowLeft; FBinWrite/B=3/F=5 refNum, WindowLeft NVAR WindowTop=root:ChartGlobals:WindowTop; FBinWrite/B=3/F=5 refNum, WindowTop NVAR DataLog=root:ChartGlobals:DataLog; FBinWrite/B=3/F=1 refNum, DataLog NVAR FileSortDialog=root:ChartGlobals:FileSortDialog; FBinWrite/B=3/F=1 refNum, FileSortDialog NVAR FileSort=root:ChartGlobals:FileSort; FBinWrite/B=3/F=1 refNum, FileSort NVAR AppendNameAndPath=root:ChartGlobals:AppendNameAndPath; FBinWrite/B=3/F=1 refNum, AppendNameAndPath NVAR OneDisplayWindow=root:ChartGlobals:OneDisplayWindow; FBinWrite/B=3/F=1 refNum, OneDisplayWindow NVAR FileFormat=root:ChartGlobals:FileFormat; FBinWrite/B=3/F=1 refNum, FileFormat NVAR ScaleDT=root:ChartGlobals:ScaleDT; FBinWrite/B=3/F=5 refNum, ScaleDT NVAR SRateDT=root:ChartGlobals:SRateDT; FBinWrite/B=3/F=5 refNum, SRateDT NVAR NumDTChannels=root:ChartGlobals:NumDTChannels; FBinWrite/B=3/F=5 refNum, NumDTChannels for(i=1;i<=9;i+=1) SVAR SortButtonX=$"root:ChartGlobals:SortButton"+num2str(i); TempStr=SortButtonX; TempStr=TempStr[0,31] TempStr=PadString(TempStr, 32, 0 ); FBinWrite/B=3 refNum, TempStr endfor for(i=1;i<=9;i+=1) SVAR SortPathX=$"root:ChartGlobals:SortPath"+num2str(i); TempStr=SortPathX; TempStr=TempStr[0,255] TempStr=PadString(TempStr, 256, 0 ); FBinWrite/B=3 refNum, TempStr endfor for(i=1;i<=6;i+=1) SVAR LogNoteX=$"root:ChartGlobals:LogNote"+num2str(i); TempStr=LogNoteX; TempStr=TempStr[0,31] TempStr=PadString(TempStr, 32, 0 ); FBinWrite/B=3 refNum, TempStr endfor // BSound spectrogram variables and string CheckSpgGlobals() NVAR FFT_size=root:BSoundGlobals:FFT_size; FBinWrite/B=3/F=5 refNum, FFT_size NVAR FrameLength=root:BSoundGlobals:FrameLength; FBinWrite/B=3/F=5 refNum, FrameLength NVAR overlap=root:BSoundGlobals:overlap; FBinWrite/B=3/F=5 refNum, overlap NVAR SmoothSpectrogram=root:BSoundGlobals:SmoothSpectrogram; FBinWrite/B=3/F=5 refNum, SmoothSpectrogram NVAR Threshold=root:BSoundGlobals:Threshold; FBinWrite/B=3/F=5 refNum, Threshold NVAR PlotDerivative=root:BSoundGlobals:PlotDerivative; FBinWrite/B=3/F=1 refNum, PlotDerivative NVAR MaxGenerationHz=root:BSoundGlobals:MaxGenerationHz; FBinWrite/B=3/F=5 refNum, MaxGenerationHz NVAR WindowType=root:BSoundGlobals:WindowType; FBinWrite/B=3/F=1 refNum, WindowType NVAR reverseColor=root:BSoundGlobals:reverseColor; FBinWrite/B=3/F=1 refNum, reverseColor SVAR SpectrogramColor=root:BSoundGlobals:SpectrogramColor; ; TempStr=SpectrogramColor; TempStr=TempStr[0,63] TempStr=PadString(TempStr, 64, 0 ); FBinWrite/B=3 refNum, TempStr Close refNum // reset IgorPref path if file saved elsewhere Pathinfo Igor NewPath/O/Q/Z IgorPrefs, S_path+"BSound Preferences" End //-------------------------------------------------------------------------------- Function ChLogButtonProc(ctrlName) String ctrlName doupdate String nbNum, LogOutput, LogOutput2, LogOutput3, LogOutput4, LogOutput5 Variable dX, dY Variable LeftSel, RightSel, Temp String Aaxis, Baxis String NoteBookWinList // get appropriate note for logging in data log SVAR LogNote1=root:ChartGlobals:LogNote1, LogNote2=root:ChartGlobals:LogNote2, LogNote3=root:ChartGlobals:LogNote3 SVAR LogNote4=root:ChartGlobals:LogNote4, LogNote5=root:ChartGlobals:LogNote5, LogNote6=root:ChartGlobals:LogNote6 String LogNote strswitch(ctrlName) case "LogNote1": LogNote = LogNote1 break case "LogNote2": LogNote = LogNote2 break case "LogNote3": LogNote = LogNote3 break case "LogNote4": LogNote = LogNote4 break case "LogNote5": LogNote = LogNote5 break case "LogNote5": LogNote = LogNote5 break endswitch String TraceAName = "", TraceBName = "" String AxisSelected = "" String DataFolder=WinName(0,1) GetWindow $DataFolder note SVAR gRealName=$"root:"+DataFolder+":gRealName" String FileName = gRealName Variable UseMarquee = 0 GetMarquee bottom if(V_Flag) UseMarquee = 1 TraceAName = Ch6MarqueeTrace() AxisSelected = Ch6MarqueeAxis() if(strlen(TraceAName)<=0 || strlen(AxisSelected)<=0) DoAlert 0, "Error in Marquee selection" return 0 endif else if(exists("root:WinGlobals:"+DataFolder+":S_CursorAInfo")) SVAR CursorAInfo=$"root:WinGlobals:"+DataFolder+":S_CursorAInfo" TraceAName = StringByKey("TNAME", CursorAInfo) endif if(exists("root:WinGlobals:"+DataFolder+":S_CursorBInfo")) SVAR CursorBInfo=$"root:WinGlobals:"+DataFolder+":S_CursorBInfo" TraceBName = StringByKey("TNAME", CursorBInfo) endif AxisSelected = StringByKey("YAXIS",TraceInfo(DataFolder,TraceAName,0)[0,128]) if(strlen(AxisSelected)<=0) AxisSelected = StringByKey("YAXIS",ImageInfo(DataFolder,TraceAName,0)[0,128]) endif //Printf "%s, %s\r", TraceAName, AxisSelected if(strlen(TraceAName)<1) Print "Data log error: Use cursors or a marquee to make a selection" return 0 endif endif if(!stringmatch(TraceAName,TraceBName) && !UseMarquee) DoAlert 0, "Cursors A and B are on different waves.\rMove cursors to the same wave\r(or use a marquee)" endif ////////////////////////////////////////////// // if both cursors are on a "TF_*" spectrogram image // ///////////////////////////////////////////// if( strsearch(TraceAName,"TF_",0) >= 0) String SPGName = "root:"+DataFolder+":"+TraceAName // Spectrograms are saved in BSoundGlobals datafolder NVAR MaxGenerationHz=root:BSoundGlobals:MaxGenerationHz GetAxis/Q/W=$DataFolder SPG // If SPG is an active axis if( !V_Flag ) dx = DimDelta($SPGName, 0) dy = DimDelta($SPGName, 1) GetMarquee SPG, bottom if( V_flag && (V_bottom < 0 || V_top> MaxGenerationHz) ) DoAlert 0, "marquee exceeds frequency range of spectrogram (0-"+num2str(MaxGenerationHz/1000)+" kHz)" return 0 endif if(UseMarquee) //Time-frequency spectrogram Marquee calculations (below) /////////////////////////////////////////////////////// ImageStats/G={((V_left-leftx($SPGName))/dX), ((V_right-leftx($SPGName))/dX), (V_bottom/dY), (V_top/dY)} $SPGName if(V_Flag<0) Print "Error in imagestats ROI operations" return 0 endif /////////////////////////////////////////////////////// //Log time-frequency spectrogram Marquee results to notebook (below) /////////////////////////////////////////////////////// NoteBookWinList = WinList("*", ";","WIN:16") if(strsearch(NoteBookWinList, "TFNotebook", 0)<0) DoAlert 1, "Open a new time-frequency spectrogram Data Log?" if(V_flag == 1) MakeNewTFDataLog() else return 0 endif endif nbNum = "TFNotebook" SPrintf LogOutput, "%s\t%s\t", FileName,"-" SPrintf LogOutput2, "%s\t%.2f\t%.2f\t%.2f\t", LogNote, V_bottom, V_top, V_top-V_bottom SPrintf LogOutput3, "%f\t%f\t%f\t", V_left, V_right, V_right-V_left SPrintf LogOutput4, "%f\t%.2f\r", V_max, V_maxColLoc*dY Notebook $nbNum text=LogOutput+LogOutput2+LogOutput3+LogOutput4 return 0 else NVAR CursorAActive=root:ChartGlobals:CursorAActive NVAR CursorBActive=root:ChartGlobals:CursorBActive // If there is no marquee then try to use cursors if 1) both cursors are active (selected) and 2) both are "TF_*" waves if(strlen(TraceAName) && stringmatch(TraceAName,TraceBName) && (strsearch(TraceAName,"TF_",0) >= 0 && strsearch(TraceBName,"TF_",0) >= 0) && (CursorAActive && CursorBActive) ) LeftSel=hcsr(A); RightSel=hcsr(B) if(LeftSel > RightSel) // Make sure Left is Left... temp = RightSel RightSel =LeftSel LeftSel = temp endif Variable TopSel=vcsr(A), BottomSel=vcsr(B) if(TopSel < BottomSel) // Make sure Left is Left... temp = BottomSel BottomSel =TopSel TopSel = temp endif //Perform time-frequency spectrogram Cursor calculations here (below) ////////////////////////////////////////////////////// dX = DimDelta($SPGName, 0) dY = DimDelta($SPGName, 1) ImageStats/G={(LeftSel-leftx($SPGName))/dX, (RightSel-leftx($SPGName))/dX, BottomSel/dY, TopSel/dY} $SPGName if(V_Flag<0) Print "Error in imagestats ROI operations" return 0 endif //Log time-frequency spectrogram Cursor results to notebook here (below) ////////////////////////////////////////////////////// NoteBookWinList = WinList("*", ";","WIN:16") if(strsearch(NoteBookWinList, "TFNotebook", 0)<0) DoAlert 1, "Open a new time-frequency spectrogram Data Log?" if(V_flag == 1) MakeNewTFDataLog() else return 0 endif endif nbNum = "TFNotebook" SPrintf LogOutput, "%s\t%s\t", FileName,"" SPrintf LogOutput2, "%s\t%.2f\t%.2f\t%.2f\t", LogNote, BottomSel, TopSel, TopSel-BottomSel SPrintf LogOutput3, "%f\t%f\t%f\t", LeftSel, RightSel, RightSel-LeftSel SPrintf LogOutput4, "%f\t%.2f\r", V_max, V_maxColLoc*dY Notebook $nbNum text=LogOutput+LogOutput2+LogOutput3+LogOutput4 endif // cursors are active endif // Marquee exists and spans a valid frequency range endif // SPG active axis return 0 endif // TraceAName includes "TF_" // marquee or cursors must be on a ch# trace // // if both cursors are active and neither cursor is on a time-frequency Spectrogram image if(UseMarquee) GetMarquee $AxisSelected, bottom // If Marquee is selected if(V_flag) // Waveform Marquee calculations (below) //////////////////////////////////////// WaveStats/Q/R=(V_left, V_right) $"root:"+DataFolder+":"+TraceAName if(V_Flag<0) Print "Error in WaveStats operation" return 0 endif //Log Waveform Marquee results to notebook here (below) //////////////////////////////////////// NoteBookWinList = WinList("*", ";","WIN:16") if(strsearch(NoteBookWinList, "WFNotebook", 0)<0) DoAlert 1, "Create a new time waveform Data Log?" if(V_flag == 1) MakeNewWFDataLog() else return 0 endif endif nbNum = "WFNotebook" SPrintf LogOutput, "%s\t%s\t", FileName,"-" // log note (from log button) and channel name SPrintf LogOutput2, "%s\t%s\t", LogNote, TraceAName // log leftX, rightX, rightX-leftX SPrintf LogOutput3, "%f\t%f\t%f\t", V_left, V_right, V_right-V_left // log leftY, rightY, rightY-leftY wave WF = $"root:"+DataFolder+":"+TraceAName SPrintf LogOutput4, "%f\t%f\t%f\t%f\t\r", WF(V_left) ,WF(V_right), V_max, V_rms Notebook $nbNum text=LogOutput+LogOutput2+LogOutput3+LogOutput4 endif else //if(strlen(TraceAName) && stringmatch(TraceAName,TraceBName)) //ASSUME CURSORS ARE ON - see entry if statement above LeftSel=hcsr(A); RightSel=hcsr(B) if(LeftSel > RightSel) // Make sure Left is Left... temp = RightSel RightSel =LeftSel LeftSel = temp endif ///////////////////////////////////////// //Perform Waveform Cursor calculations here (below) //////////////////////////////////////// WaveStats/Q/R=(LeftSel, RightSel) $"root:"+DataFolder+":"+TraceAName if(V_Flag<0) Print "Error in WaveStats operation" return 0 endif //////////////////////////////////////// //Log Waveform Cursor results to notebook here (below) //////////////////////////////////////// NoteBookWinList = WinList("*", ";","WIN:16") if(strsearch(NoteBookWinList, "WFNotebook", 0)<0) DoAlert 1, "Create a new time waveform Data Log?" if(V_flag == 1) MakeNewWFDataLog() else return 0 endif endif nbNum = "WFNotebook" SPrintf LogOutput, "%s\t%s\t", FileName, "-" // log note (from log button) and channel name SPrintf LogOutput2, "%s\t%s\t", LogNote, TraceAName // log leftX, rightX, rightX-leftX SPrintf LogOutput3, "%f\t%f\t%f\t", LeftSel, RightSel, RightSel-LeftSel // log leftY, rightY, rightY-leftY wave WF = $"root:"+DataFolder+":"+TraceAName SPrintf LogOutput4, "%f\t%f\t%f\t%f\r", WF(LeftSel) ,WF(RightSel), V_max, V_rms Notebook $nbNum text=LogOutput+LogOutput2+LogOutput3+LogOutput4 endif End // Create a new data log Function MakeNewTFDataLog() // Create a time-frequency spectrogram data log String nbNum = "TFNotebook" NewNotebook/N=$nbNum/F=0/V=1/K=0/W=(5,40,505,335) as "Time-frequency Spectrogram Data Log" Notebook $nbNum defaultTab=72, statusWidth=238, pageMargins={72,72,72,72} Notebook $nbNum font="Geneva", fSize=10, fStyle=0, textRGB=(0,0,0) Notebook $nbNum text="Time-frequency Spectrogram data log created on " + date() + " at " + time() + "\r" Notebook $nbNum text="FileName\tNa\tNote\tLowHz\tHighHz\tHighHz-LowHz\tLeftSec\tRightSec\tRightSec-LeftSec\tpeakdB\tHzatPeakdB\r\r" End Function MakeNewAllChTFDataLog() // Create a time-frequency spectrogram data log String nbNum = "TFNotebook" NewNotebook/N=$nbNum/F=0/V=1/K=0/W=(5,40,505,335) as "Time-frequency Spectrogram Data Log" Notebook $nbNum defaultTab=72, statusWidth=238, pageMargins={72,72,72,72} Notebook $nbNum font="Geneva", fSize=10, fStyle=0, textRGB=(0,0,0) Notebook $nbNum text="Time-frequency Spectrogram data log created on " + date() + " at " + time() + "\r" Notebook $nbNum text="FileName\tNa\tNote\tLowHz\tHighHz\tHighHz-LowHz\tLeftSec\tRightSec\tRightSec-LeftSec\tpeakdB\tHzatPeakdB\t" NVAR CurrBlock = root:ChartGlobals:CurrBlock SVAR BlockList=root:ChartGlobals:BlockList string BlockString NVAR FirstBlock=root:ChartGlobals:FirstBlock SVAR StrCurrBlock=root:ChartGlobals:StrCurrBlock sprintf StrCurrBlock, "%0.3d", CurrBlock // get wave names SVAR Ch1Name=root:ChartGlobals:Ch1Name SVAR Ch2Name=root:ChartGlobals:Ch2Name SVAR Ch3Name=root:ChartGlobals:Ch3Name SVAR Ch4Name=root:ChartGlobals:Ch4Name SVAR Ch5Name=root:ChartGlobals:Ch5Name SVAR Ch6Name=root:ChartGlobals:Ch6Name Notebook $nbNum text=Ch1Name+"-Peak\t"+Ch1Name+"-RMS\t"+Ch2Name+"-Peak\t"+Ch2Name+"-RMS\t" Notebook $nbNum text=Ch3Name+"-Peak\t"+Ch3Name+"-RMS\t"+Ch4Name+"-Peak\t"+Ch4Name+"-RMS\t" Notebook $nbNum text=Ch5Name+"-Peak\t"+Ch5Name+"-RMS\t"+Ch6Name+"-Peak\t"+Ch6Name+"-RMS\t" Notebook $nbNum text="\r\r" End Function MakeNewWFDataLog() // Create a waveform data log String nbNum = "WFNotebook" NewNotebook/N=$nbNum/F=0/V=1/K=0/W=(5,40,505,335) as "Time-amplitude waveform Data Log" Notebook $nbNum defaultTab=72, statusWidth=238, pageMargins={72,72,72,72} Notebook $nbNum font="Geneva", fSize=10, fStyle=0, textRGB=(0,0,0) Notebook $nbNum text="Time-amplitude waveform data log created on " + date() + " at " + time() + "\r" Notebook $nbNum text="FileName\tNa\tNote\tChannel\tLeftX\tRightX\tRightX-LeftX\tLeftY\tRightY\tMaxY\tRMSY\r\r" End Function MakeNewAllChWFDataLog() // Create a waveform data log String nbNum = "WFNotebook" NewNotebook/N=$nbNum/F=0/V=1/K=0/W=(5,40,505,335) as "Time-amplitude waveform Data Log" Notebook $nbNum defaultTab=72, statusWidth=238, pageMargins={72,72,72,72} Notebook $nbNum font="Geneva", fSize=10, fStyle=0, textRGB=(0,0,0) Notebook $nbNum text="Time-amplitude waveform data log created on " + date() + " at " + time() + "\r" Notebook $nbNum text="Identifier\tBlockNum\tNote\tLeftX\tRightX\tRightX-LeftX\t" NVAR CurrBlock = root:ChartGlobals:CurrBlock SVAR BlockList=root:ChartGlobals:BlockList string BlockString NVAR FirstBlock=root:ChartGlobals:FirstBlock SVAR StrCurrBlock=root:ChartGlobals:StrCurrBlock sprintf StrCurrBlock, "%0.3d", CurrBlock // get wave names SVAR Ch1Name=root:ChartGlobals:Ch1Name SVAR Ch2Name=root:ChartGlobals:Ch2Name SVAR Ch3Name=root:ChartGlobals:Ch3Name SVAR Ch4Name=root:ChartGlobals:Ch4Name SVAR Ch5Name=root:ChartGlobals:Ch5Name SVAR Ch6Name=root:ChartGlobals:Ch6Name Notebook $nbNum text=Ch1Name+"-Peak\t"+Ch1Name+"-RMS\t"+Ch2Name+"-Peak\t"+Ch2Name+"-RMS\t" Notebook $nbNum text=Ch3Name+"-Peak\t"+Ch3Name+"-RMS\t"+Ch4Name+"-Peak\t"+Ch4Name+"-RMS\t" Notebook $nbNum text=Ch5Name+"-Peak\t"+Ch5Name+"-RMS\t"+Ch6Name+"-Peak\t"+Ch6Name+"-RMS\t" Notebook $nbNum text="\r\r" End Function MakeNewSPKDataLog() // Create a waveform data log String nbNum = "SPKNotebook" NewNotebook/N=$nbNum/F=0/V=1/K=0/W=(5,40,505,335) as "Spectrum Data Log" Notebook $nbNum defaultTab=72, statusWidth=238, pageMargins={72,72,72,72} Notebook $nbNum font="Geneva", fSize=10, fStyle=0, textRGB=(0,0,0) Notebook $nbNum text="Spectrum data log created on " + date() + " at " + time() + "\r" Notebook $nbNum text="FileName\tNa\tNote\tAHz\tBHz\tAHz-BHz\tAHzdB\tBHzdB\tAHzdB-BHzdB\tPeakdB\r\r" End // Open existing data log Function OpenTFDataLog() // Open an existing time-frequency spectrogram data log OpenNotebook/A /K=0/M="Locate a time-frequency spectrogram data log"/N=TFNotebook/V=1 End Function OpenWFDataLog()// Open an existing waveform data log OpenNotebook/A /K=0/M="Locate a waveform data log"/N=WFNotebook/V=1 End Function OpenSPKDataLog()// Open an existing waveform data log OpenNotebook/A /K=0/M="Locate a spectrum data log"/N=SPKNotebook/V=1 End Function/S Ch6MarqueeTrace() String CurrWinName = WinName(0,1) NVAR ppV=root:ChartGlobals:ppV // Chart ppv value String Axlist = AxisList(CurrWinName), CurrAx// get axis list Axlist = RemoveFromList("bottom", Axlist) // assume "bottom" and remove from list variable i, AxisMin, AxisMax for(i=0;i AxisMin && V_top AxisMin && V_top < AxisMax) // if marquee is within plot range of current axis return CurrAx endif endif endfor return "" End Function PlotButtonProc(ctrlName) : ButtonControl String ctrlName ChGraphData() End Function ChGraphData() SetDataFolder root: CheckChGlobals() NVAR OneDisplayWindow=root:ChartGlobals:OneDisplayWindow String WindowList = WinList("*", ";", "WIN:1") String CurrWindowName=WinName(0,1) if(OneDisplayWindow && strsearch(WindowList,CurrWindowName,0)>=0 && strlen(WindowList)>0) DoWindow/K $CurrWindowName endif NVAR FileFormat=root:ChartGlobals:FileFormat if(ChPlotChart(FileFormat,"")) ChFormatChart(1) else return 0 endif NVAR AutoSpectrogram=root:ChartGlobals:AutoSpectrogram if(AutoSpectrogram) ChAppendSPG("Spectrogram") endif End Function ChSaveFiles() NVAR FileFormat=root:ChartGlobals:FileFormat String DataFolder=WinName(0,1) if(strlen(DataFolder)<1) Abort "No Window is open" return 0 endif SVAR gRealName=$"root:"+DataFolder+":gRealName" String NameStr SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" switch(FileFormat) case 0: Wave firstWave=$"root:"+DataFolder+":"+StringFromList(0,gWaveNames) Variable lx=leftx(firstWave), rx=pnt2x(firstWave,numpnts(firstWave)-1) GetMarquee bottom if(V_flag) lx=V_left; rx=V_right endif NameStr=gRealName[0,strlen(gRealName)-5] WriteBSF(NameStr+" copy.bsf", gWaveNames, gWaveNames, lx, rx, 1, 1) break default: case 1: NameStr=gRealName[0,strlen(gRealName)-3] Variable refNum Open/D/C="????"/M="Save signal files (extension added automatically!)" refNum as NameStr if(strlen(S_fileName)<=0) return 0 endif String FileName = StringFromList(ItemsInList(S_fileName,":")-1, S_fileName, ":") String FilePath=RemoveFromList(FileName, S_fileName, ":") Variable i for(i=0;i=0 ) DoWindow/K $TopWindName endif if(stringmatch(popStr, "Open file")) ChGraphData() return 0 endif NVAR FileFormat=root:ChartGlobals:FileFormat if(ChPlotChart(FileFormat,popStr)) ChFormatChart(1) else return 0 endif NVAR AutoSpectrogram=root:ChartGlobals:AutoSpectrogram if(AutoSpectrogram) ChAppendSPG("Spectrogram") endif End Function NextFileProc(ctrlName) : ButtonControl String ctrlName NVAR OneDisplayWindow=root:ChartGlobals:OneDisplayWindow SVAR gRealName=$"root:"+WinName(0,1)+":gRealName" String CurrentFileName=gRealName String WindowList = WinList("*", ";", "WIN:1") if(OneDisplayWindow && strsearch(WindowList,WinName(0,1),0)>=0 ) DoWindow/K $WinName(0,1) endif SVAR FolderFileList=root:ChartGlobals:FolderFileList String TempFileList=FolderFileList TempFileList=RemoveFromList("Open file", TempFileList) TempFileList=RemoveFromList("-", TempFileList) Variable CurFileNum=WhichListItem(CurrentFileName, TempFileList) Variable NumFiles=ItemsInList(TempFileList) Variable NextFileNum=CurFileNum+1 if(NextFileNum>=NumFiles) NextFileNum=0 endif String NextFile=StringFromList(NextFileNum,TempFileList ) NVAR FileFormat=root:ChartGlobals:FileFormat if(ChPlotChart(FileFormat,NextFile)) ChFormatChart(1) else return 0 endif NVAR AutoSpectrogram=root:ChartGlobals:AutoSpectrogram if(AutoSpectrogram) ChAppendSPG("Spectrogram") endif End Function PreviousFileProc(ctrlName) : ButtonControl String ctrlName NVAR OneDisplayWindow=root:ChartGlobals:OneDisplayWindow String DataFolder=WinName(0,1) SVAR gRealName=$"root:"+DataFolder+":gRealName" String CurrentFileName=gRealName String WindowList = WinList("*", ";", "WIN:1") if(OneDisplayWindow && strsearch(WindowList,WinName(0,1),0)>=0 ) DoWindow/K $DataFolder endif SVAR FolderFileList=root:ChartGlobals:FolderFileList String TempFileList=FolderFileList TempFileList=RemoveFromList("Open file", TempFileList) TempFileList=RemoveFromList("-", TempFileList) Variable CurFileNum=WhichListItem(CurrentFileName, TempFileList) Variable NumFiles=ItemsInList(TempFileList) Variable PreviousFileNum=CurFileNum-1 if(PreviousFileNum<0) PreviousFileNum=NumFiles-1 endif String PreviousFile=StringFromList(PreviousFileNum,TempFileList ) NVAR FileFormat=root:ChartGlobals:FileFormat if(ChPlotChart(FileFormat,PreviousFile)) ChFormatChart(1) else return 0 endif NVAR AutoSpectrogram=root:ChartGlobals:AutoSpectrogram if(AutoSpectrogram) ChAppendSPG("Spectrogram") endif End //--------------------------------------------------------------- Function ChAppendSPG(ctrlName) : ButtonControl String ctrlName String DataFolder=WinName(0,1) SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" Variable PlotSPG=0 // Make Global NVAR SPGWave=root:ChartGlobals:SPGWave, SPGProportion=root:ChartGlobals:SPGProportion String Nm="root:"+DataFolder+":"+StringFromList(SPGWave-1, gWaveNames) String TFNm="root:"+DataFolder+":"+PossiblyQuoteName("TF_"+StringFromList(SPGWave-1, gWaveNames)) String TFTrace=PossiblyQuoteName("TF_"+StringFromList(SPGWave-1, gWaveNames)) String BSTFNm="root:BSoundGlobals:"+PossiblyQuoteName("TF_"+StringFromList(SPGWave-1, gWaveNames)) String HPNm="root:"+DataFolder+":"+PossiblyQuoteName("HP_"+StringFromList(SPGWave-1, gWaveNames)) String HPTrace=PossiblyQuoteName("HP_"+StringFromList(SPGWave-1, gWaveNames)) String BSHPNm="root:BSoundGlobals:"+PossiblyQuoteName("HP_"+StringFromList(SPGWave-1, gWaveNames)) String RMSNm="root:"+DataFolder+":"+PossiblyQuoteName("RMS_"+StringFromList(SPGWave-1, gWaveNames)) String RMSTrace=PossiblyQuoteName("RMS_"+StringFromList(SPGWave-1, gWaveNames)) String BSRMSNm="root:BSoundGlobals:"+PossiblyQuoteName("RMS_"+StringFromList(SPGWave-1, gWaveNames)) String TFHzNm="root:"+DataFolder+":"+PossiblyQuoteName("TFHz_"+StringFromList(SPGWave-1, gWaveNames)) String TFHzTrace=PossiblyQuoteName("TFHz_"+StringFromList(SPGWave-1, gWaveNames)) String BSTFHzNm="root:BSoundGlobals:"+PossiblyQuoteName("TFHz_"+StringFromList(SPGWave-1, gWaveNames)) String TFdBNm="root:"+DataFolder+":"+PossiblyQuoteName("TFdB_"+StringFromList(SPGWave-1, gWaveNames)) String BSTFdBNm="root:BSoundGlobals:"+PossiblyQuoteName("TFdB_"+StringFromList(SPGWave-1, gWaveNames)) String TFdBTrace=PossiblyQuoteName("TFdB_"+StringFromList(SPGWave-1, gWaveNames)) DoUpdate if(stringmatch(ctrlName, "Spectrogram")) GetMarquee bottom if(V_flag) Duplicate/O/R=(V_left, V_right) $Nm, $"root:"+StringFromList(SPGWave-1, gWaveNames) Nm="root:"+StringFromList(SPGWave-1, gWaveNames) else GetAxis/Q bottom Duplicate/O/R=(V_min, V_max) $Nm, $"root:"+StringFromList(SPGWave-1, gWaveNames) Nm="root:"+StringFromList(SPGWave-1, gWaveNames) endif CheckBSGlobals() CheckSpgGlobals() Variable/G Progress, root:BSoundGlobals:ProgressStopCtrl CheckSGWave($Nm) NVAR PlotFFTPeaks=root:BSoundGlobals:PlotFFTPeaks; PlotFFTPeaks=1 SpectrogramGeneration($Nm) Variable AddSpectrogram=0 if(AddSpectrogram) Wave TF=$TFNm, BSTF=$BSTFNm if(waveexists(TF)) Variable LastNewPnt=(ceil(DimOffset(BSTF, 0)/DimDelta(BSTF,0))+DimSize(BSTF, 0)) Variable LastOldPnt=(ceil(DimOffset(TF, 0)/DimDelta(TF,0))+DimSize(TF, 0)) Variable FirstNewPnt=floor(DimOffset(BSTF, 0)/DimDelta(BSTF,0)) Variable FirstOldPnt=floor(DimOffset(TF, 0)/DimDelta(TF,0)) Variable OldOffset=DimOffset(TF, 0), NewOffset=DimOffset(BSTF, 0) Variable NewSize=min(LastNewPnt, LastOldPnt)-min(FirstNewPnt, FirstOldPnt) Make/O/N=(NewSize,DimSize(BSTF, 1)) NewSPG SetScale/P x min(OldOffset, NewOffset), DimDelta(BSTF,0), "sec", NewSPG SetScale/P y 0, DimDelta(BSTF,1), "Hz", NewSPG NewSPG[FirstOldPnt][]=TF[p][q] NewSPG[FirstNewPnt][]+=BSTF[p][q] //Duplicate/O NewSPG, $TFNm; KillWaves/Z NewSPG endif else Duplicate/O $BSTFNm, $TFNm; KillWaves/Z $BSTFNm endif Duplicate/O $BSHPNm, $HPNm; KillWaves/Z $BSHPNm Duplicate/O $BSRMSNm, $RMSNm; KillWaves/Z $BSRMSNm Duplicate/O $BSTFdBNm, $TFdBNm; KillWaves/Z $BSTFdBNm Duplicate/O $BSTFHzNm, $TFHzNm; KillWaves/Z $BSTFHzNm KillWaves/Z $Nm PlotSPG=1 ControlBar 50 Button Spectrogram title="Waveform", proc=ChAppendSPG, rename=Waveform SetVariable FirstZdB disable=0, pos={6,30},size={45,15},title=" ",limits={-90,90,3}, value= root:ChartGlobals:FirstZ, Proc=SPGZProc SetVariable LastZdB disable=0, pos={58,30},size={45,15},title=" ",limits={-90,90,3}, value= root:ChartGlobals:LastZ, Proc=SPGZProc NVAR ChSel=root:ChartGlobals:ChSel PopupMenu ChPopUp mode=ChSel endif NVAR DataLog=root:ChartGlobals:DataLog if(!DataLog) ControlBar 50 //SetVariable FirstZdB disable=1 //SetVariable LastZdB disable=1 SetVariable DataLogNote1 disable=1; Button LogNote1 disable=1;DelayUpdate SetVariable DataLogNote2 disable=1; Button LogNote2 disable=1;DelayUpdate SetVariable DataLogNote3 disable=1; Button LogNote3 disable=1;DelayUpdate SetVariable DataLogNote4 disable=1; Button LogNote4 disable=1;DelayUpdate SetVariable DataLogNote5 disable=1; Button LogNote5 disable=1;DelayUpdate SetVariable DataLogNote6 disable=1; Button LogNote6 disable=1;DelayUpdate else ControlBar 72 SetVariable DataLogNote1 pos={40,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote1;DelayUpdate Button LogNote1 pos={5,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote2 pos={140,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote2;DelayUpdate Button LogNote2 pos={105,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote3 pos={240,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote3;DelayUpdate Button LogNote3 pos={205,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote4 pos={340,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote4;DelayUpdate Button LogNote4 pos={305,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote5 pos={440,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote5;DelayUpdate Button LogNote5 pos={405,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote6 pos={540,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote6;DelayUpdate Button LogNote6 pos={505,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate endif NVAR FileSort=root:ChartGlobals:FileSort Variable YPos if(FileSort) if(DataLog) ControlBar 92 YPos=73 else ControlBar 72 YPos=52 endif SVAR SortButton1=root:ChartGlobals:SortButton1, SortButton2=root:ChartGlobals:SortButton2, SortButton3=root:ChartGlobals:SortButton3 SVAR SortButton4=root:ChartGlobals:SortButton4, SortButton5=root:ChartGlobals:SortButton5, SortButton6=root:ChartGlobals:SortButton6 SVAR SortButton7=root:ChartGlobals:SortButton7, SortButton8=root:ChartGlobals:SortButton8, SortButton9=root:ChartGlobals:SortButton9 Button SortSave1 disable=0, pos={5,YPos},size={65,16},title=SortButton1, proc=SortSaveButtonProc;DelayUpdate Button SortSave2 disable=0, pos={75,YPos},size={65,16},title=SortButton2, proc=SortSaveButtonProc;DelayUpdate Button SortSave3 disable=0, pos={145,YPos},size={65,16},title=SortButton3, proc=SortSaveButtonProc;DelayUpdate Button SortSave4 disable=0, pos={215,YPos},size={65,16},title=SortButton4, proc=SortSaveButtonProc;DelayUpdate Button SortSave5 disable=0, pos={285,YPos},size={65,16},title=SortButton5, proc=SortSaveButtonProc;DelayUpdate Button SortSave6 disable=0, pos={355,YPos},size={65,16},title=SortButton6, proc=SortSaveButtonProc;DelayUpdate Button SortSave7 disable=0, pos={425,YPos},size={65,16},title=SortButton7, proc=SortSaveButtonProc;DelayUpdate Button SortSave8 disable=0, pos={495,YPos},size={65,16},title=SortButton8, proc=SortSaveButtonProc;DelayUpdate Button SortSave9 disable=0, pos={565,YPos},size={65,16},title=SortButton9, proc=SortSaveButtonProc;DelayUpdate else Button SortSave1 disable=1; Button SortSave2 disable=1; Button SortSave3 disable=1 Button SortSave4 disable=1; Button SortSave5 disable=1; Button SortSave6 disable=1 Button SortSave7 disable=1; Button SortSave8 disable=1; Button SortSave9 disable=1 endif Variable numtoplot=0 NVAR PlotCh1=root:ChartGlobals:PlotCh1, PlotCh2=root:ChartGlobals:PlotCh2, PlotCh3=root:ChartGlobals:PlotCh3 NVAR PlotCh4=root:ChartGlobals:PlotCh4, PlotCh5=root:ChartGlobals:PlotCh5, PlotCh6=root:ChartGlobals:PlotCh6 if(PlotCh1) numtoplot += 1 endif if(PlotCh2) numtoplot += 1 endif if(PlotCh3) numtoplot += 1 endif if(PlotCh4) numtoplot += 1 endif if(PlotCh5) numtoplot += 1 endif if(PlotCh6) numtoplot += 1 endif Variable TopOfTraces = 1-SPGProportion if(!PlotSPG) TopOfTraces=1 endif Variable SizeOfEach = TopOfTraces/numtoplot numtoplot=0 if(PlotCh1) numtoplot += 1 Variable TopCh1 = TopOfTraces, BottomCh1 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) ModifyGraph axisEnab(Ch1)={BottomCh1, TopCh1} endif if(PlotCh2) numtoplot += 1 Variable TopCh2 = TopOfTraces-(SizeOfEach*(numtoplot-1)), BottomCh2 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) ModifyGraph axisEnab(Ch2)={BottomCh2, TopCh2} endif if(PlotCh3) numtoplot += 1 Variable TopCh3 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh3 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) ModifyGraph axisEnab(Ch3)={BottomCh3, TopCh3} endif if(PlotCh4) numtoplot += 1 Variable TopCh4 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh4 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) ModifyGraph axisEnab(Ch4)={BottomCh4, TopCh4} endif if(PlotCh5) numtoplot += 1 Variable TopCh5 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh5 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) ModifyGraph axisEnab(Ch5)={BottomCh5, TopCh5} endif if(PlotCh6) numtoplot += 1 Variable TopCh6 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh6 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) ModifyGraph axisEnab(Ch6)={BottomCh6, TopCh6} endif if(PlotSPG) AppendImage/L=SPG $TFTrace ModifyImage $TFTrace ctab= {*,*,Grays,1} ModifyGraph axisEnab(SPG)={TopOfTraces+0.03,1},freePos(SPG)=0, lblPos=56 Variable AbsoluteZ=0, AutoZSPG=0 // MAKE GLOBAL NVAR LastZ=root:ChartGlobals:LastZ, FirstZ=root:ChartGlobals:FirstZ NVAR ppV=root:ChartGlobals:ppV NVAR MinSpgkHz=root:ChartGlobals:MinSpgkHz, MaxSpgkHz=root:ChartGlobals:MaxSpgkHz SetAxis SPG MinSpgkHz*1000,MaxSpgkHz*1000 Variable lastZ_inc, SetLastZ, SetFirstZ, maxZ, minZ if(AbsoluteZ) if(AutoZSPG) FirstZ=-18 // set to -18 dB re: maximum file amplitude LastZ=-90 endif lastZ_inc=3 maxZ=200; minZ=-200 SetLastZ=ppV*(10^(LastZ/20)) SetFirstZ=ppV*(10^(FirstZ/20)) else Wave SPG=$TFNm imagestats/G={ceil(DimOffset(SPG, 0 ))+1, floor(DimSize(SPG,0)-1)-1, ceil((MinSpgkHz*1000)/DimDelta(SPG, 1))+1, floor((MaxSpgkHz*1000)/(DimDelta(SPG, 1)))-1} SPG if(AutoZSPG) FirstZ=-12 // set to -12 dB re: peak of current spectrogram LastZ=round(log(V_avg/4)*20) endif lastZ_inc=3 maxZ=100; minZ=-100 SetLastZ=V_max*(10^(LastZ/20)) SetFirstZ=V_max*(10^(FirstZ/20)) endif NVAR logHz=root:ChartGlobals:logHz if(logHz) ModifyGraph log(SPG)=1,loglinear(SPG)=1 endif ModifyImage $TFTrace ctab= {SetLastZ,SetFirstZ,Grays,1};DelayUpdate Label SPG "\\Z10frequency (\\U)";DelayUpdate ModifyGraph fSize=10, highTrip(SPG)=999, nticks(SPG)=4;DelayUpdate ModifyGraph tick=2 NVAR GridLines=root:ChartGlobals:GridLines if(GridLines) ModifyGraph grid(SPG)=2 endif // Brian's user defined ticks... NVAR UseBriansTicks=root:ChartGlobals:UseBriansTicks GetAxis/Q SPG if(UseBriansTicks==1) //Make/O/T MyTicksLbls={"1","2","3","","4","6","8","10", "15"} //Make/O MyTicksValues={1000,2000,3000,3500,4000,6000,8000,10000,15000} Make/O/T MyTicksLbls={"1","2","3","4","6","8","10", "15"} Make/O MyTicksValues={1000,2000,3000,4000,6000,8000,10000,15000} ModifyGraph userticks(SPG)={MyTicksValues, MyTicksLbls} endif else RemoveImage/Z $stringfromlist(0, ImageNameList("",";")) Variable i for(i=0;i<=5;i+=1) if(strlen(StringByKey("CWAVE", AxisInfo("","SPG")))) RemoveFromGraph/Z $StringByKey("CWAVE", AxisInfo("","SPG")) endif endfor Button Waveform title="Spectrogram", proc=ChAppendSPG, rename=Spectrogram NVAR ChSel=root:ChartGlobals:ChSel PopupMenu ChPopUp mode=ChSel endif NVAR PlotSpectrum=root:ChartGlobals:PlotSpectrum if(PlotSpectrum && PlotSPG) // Plot Spectrogram AND Spectrum NVAR MinSpgkHz=root:ChartGlobals:MinSpgkHz wavestats/Q/R=(MinSpgkHz*1000) $TFdBNm // skip first 150 Hz when setting scale variable highdB = V_max variable lowdB = V_max - (V_sdev*4) // display values within 4 standard deviations of spectrum peak amplitude AppendToGraph/L=SPG/B=psd_bottom $TFHzNm vs $TFdBNm SetAxis psd_bottom lowdB,highdB ModifyGraph rgb($TFHzTrace)=(39321,39319,1) ModifyGraph nticks(psd_bottom)=4,highTrip(psd_bottom)=99;DelayUpdate ModifyGraph axisEnab(psd_bottom)={.01,0.35},freePos(psd_bottom)={(MaxSpgkHz*1000),SPG};DelayUpdate ModifyGraph tick(psd_bottom)=0 Label psd_bottom "\\Z10dB";DelayUpdate ModifyGraph fSize=10,lblPos(psd_bottom)=-12;DelayUpdate ModifyGraph lblLatPos(psd_bottom)=0;DelayUpdate ModifyGraph axRGB(psd_bottom)=(39321,39319,1), tlOffset(psd_bottom)=-28, tickEnab(psd_bottom)={-50,150};DelayUpdate ModifyGraph tlblRGB(psd_bottom)=(39321,39319,1), alblRGB(psd_bottom)=(39321,39319,1);DelayUpdate Endif string Platform = IgorInfo(2) // use when platform related issues arise NVAR PlotkHzPeaks=root:ChartGlobals:PlotkHzPeaks if(PlotkHzPeaks && PlotSPG) AppendToGraph/L=SPG $HPNm;DelayUpdate ModifyGraph mode($NameOfWave($HPNm))=3,marker($NameOfWave($HPNm))=19;DelayUpdate ModifyGraph msize($NameOfWave($HPNm))=0.5,mrkThick($NameOfWave($HPNm))=0.5 if(stringmatch(platform, "Macintosh")) ModifyGraph mrkThick($NameOfWave($HPNm))=0 endif endif NVAR PlotRMS=root:ChartGlobals:PlotRMS if(PlotRMS) AppendToGraph/L=$"Ch"+num2str(SPGWave) $RMSNm;DelayUpdate endif NVAR CursorAActive=root:ChartGlobals:CursorAActive, CursorBActive=root:ChartGlobals:CursorBActive NVAR ChSel=root:ChartGlobals:ChSel if((CursorAActive || CursorBActive) )//&& PlotSPG) UpdateCursors() UpdateCursors() endif return 0 End Function SPGZProc(ctrlName,varNum,varStr,varName) : SetVariableControl String ctrlName Variable varNum String varStr String varName NVAR LastZ=root:ChartGlobals:LastZ, FirstZ=root:ChartGlobals:FirstZ if(stringmatch("FirstZdB", ctrlName)) FirstZ=varNum else LastZ=varNum endif NVAR ppV=root:ChartGlobals:ppV NVAR MinSpgkHz=root:ChartGlobals:MinSpgkHz, MaxSpgkHz=root:ChartGlobals:MaxSpgkHz Variable SetLastZ, SetFirstZ String SPGimage = ImageNameList(WinName(0,1), "" ) Variable AbsoluteZ=0 // MAKE GLOBAL if(AbsoluteZ) SetLastZ=ppV*(10^(LastZ/20)) SetFirstZ=ppV*(10^(FirstZ/20)) else String DataFolder=WinName(0,1) Wave SPG= $"root:"+DataFolder+":"+PossiblyQuoteName(StringFromList(0, ImageNameList("",";"))) imagestats/G={ceil(DimOffset(SPG, 0 ))+1, floor(DimSize(SPG,0)-1)-1, ceil((MinSpgkHz*1000)/DimDelta(SPG, 1))+1, floor((MaxSpgkHz*1000)/(DimDelta(SPG, 1)))-1} SPG SetLastZ=V_max*(10^(LastZ/20)) SetFirstZ=V_max*(10^(FirstZ/20)) endif ModifyImage $PossiblyQuoteName(StringFromList(0, ImageNameList("",";"))) ctab= {SetLastZ, SetFirstZ,Grays,1} End Function ChFormatChart(mode) Variable mode String DataFolder=WinName(0,1) SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" Wave Wave1=$StringFromList(0, gWaveNames) SVAR FileWav1=root:ChartGlobals:FileWav1, FileWav2=root:ChartGlobals:FileWav2, FileWav3=root:ChartGlobals:FileWav3 SVAR FileWav4=root:ChartGlobals:FileWav4, FileWav5=root:ChartGlobals:FileWav5, FileWav6=root:ChartGlobals:FileWav6 NVAR PlotCh1=root:ChartGlobals:PlotCh1, PlotCh2=root:ChartGlobals:PlotCh2, PlotCh3=root:ChartGlobals:PlotCh3 NVAR PlotCh4=root:ChartGlobals:PlotCh4, PlotCh5=root:ChartGlobals:PlotCh5, PlotCh6=root:ChartGlobals:PlotCh6 ModifyGraph rgb=(0,0,0), margin(left)=61, margin(top)=25, lblPos=56, fSize=10 ControlBar 50 Button Spectrogram pos={8,3},size={100,20},title="Spectrogram", Proc=ChAppendSPG SetVariable FirstZdB disable=0, pos={11,30},size={45,15},title=" ",limits={-90,90,3}, value= root:ChartGlobals:FirstZ, noproc SetVariable LastZdB disable=0, pos={61,30},size={45,15},title=" ",limits={-90,90,3}, value= root:ChartGlobals:LastZ, noproc PopupMenu SelectFile pos={115,3},size={50,20},bodyWidth=50, mode=0, title="file:", Proc=LoadSelectedFile PopupMenu SelectFile value=#root:ChartGlobals:FolderFileList //PopupMenu FileFormat,pos={110,27},size={60,20},bodyWidth=60, proc=FileFormatProc,title=" " //NVAR FileFormat=root:ChartGlobals:FileFormat //PopupMenu FileFormat,mode=FileFormat+1,value= #"\"BSF;Signal;DT\"" Button PreviousFile pos={115,28},size={23,18},title="-", Proc=PreviousFileProc Button NextFile pos={142,28},size={23,18},title="+", proc=NextFileProc Button Crop pos={175,3},size={44,18},title="Crop", Proc=DeleteCropButtonProc Button Clear pos={225,3},size={40,18},title="Clear", Proc=ClearSPGButtonProc Button Delete pos={270,3},size={49,18},title="Delete", Proc=DeleteCropButtonProc Button StopPlay pos={225,28},size={40,18},title="Stop", Proc=StopChartProc Button PlayWave pos={270,28},size={50,18},title="Play", Proc=PlayChartProc PopupMenu FunctionMenu pos={330,2},size={20,20},mode=0, Proc=WindowDSPFunction PopupMenu FunctionMenu value= "Cursors;SPG threshold;-;Spectrum;Spectrum (A);Pitch;FIR filter;Smooth;Zero at Min;Zero at Mode;Resample;-;Crop;Delete;Normalize;Multiply;Divide;Add;Subtract" SetVariable FunctionValue pos={355,5},size={45,20},title=" " SetVariable FunctionValue value= root:ChartGlobals:FunctionValue NVAR ChSel=root:ChartGlobals:ChSel PopupMenu ChPopUp pos={405,2},mode=ChSel, Proc=ChPopUpProc PopupMenu ChPopUp value= "1;2;3;4;5;6;SPG" NVAR DataLog=root:ChartGlobals:DataLog if(DataLog) ControlBar 72 SetVariable DataLogNote1 pos={40,52},size={60,20},title=" ",value=root:ChartGlobals:LogNote1;DelayUpdate Button LogNote1 pos={5,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote2 pos={140,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote2;DelayUpdate Button LogNote2 pos={105,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote3 pos={240,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote3;DelayUpdate Button LogNote3 pos={205,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote4 pos={340,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote4;DelayUpdate Button LogNote4 pos={305,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote5 pos={440,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote5;DelayUpdate Button LogNote5 pos={405,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate SetVariable DataLogNote6 pos={540,53},size={60,20},title=" ",value=root:ChartGlobals:LogNote6;DelayUpdate Button LogNote6 pos={505,52},size={32,16},title="log", proc=ChLogButtonProc;DelayUpdate else SetVariable DataLogNote1 disable=1; Button DataLog1 disable=1;DelayUpdate SetVariable DataLogNote2 disable=1; Button DataLog2 disable=1;DelayUpdate SetVariable DataLogNote3 disable=1; Button DataLog3 disable=1;DelayUpdate SetVariable DataLogNote4 disable=1; Button DataLog4 disable=1;DelayUpdate SetVariable DataLogNote5 disable=1; Button DataLog5 disable=1;DelayUpdate SetVariable DataLogNote6 disable=1; Button DataLog6 disable=1;DelayUpdate endif NVAR FileSort=root:ChartGlobals:FileSort Variable YPos if(FileSort) if(DataLog) ControlBar 92 YPos=73 else ControlBar 72 YPos=52 endif SVAR SortButton1=root:ChartGlobals:SortButton1, SortButton2=root:ChartGlobals:SortButton2, SortButton3=root:ChartGlobals:SortButton3 SVAR SortButton4=root:ChartGlobals:SortButton4, SortButton5=root:ChartGlobals:SortButton5, SortButton6=root:ChartGlobals:SortButton6 SVAR SortButton7=root:ChartGlobals:SortButton7, SortButton8=root:ChartGlobals:SortButton8, SortButton9=root:ChartGlobals:SortButton9 Button SortSave1 pos={5,YPos},size={65,16},title=SortButton1, proc=SortSaveButtonProc;DelayUpdate Button SortSave2 pos={75,YPos},size={65,16},title=SortButton2, proc=SortSaveButtonProc;DelayUpdate Button SortSave3 pos={145,YPos},size={65,16},title=SortButton3, proc=SortSaveButtonProc;DelayUpdate Button SortSave4 pos={215,YPos},size={65,16},title=SortButton4, proc=SortSaveButtonProc;DelayUpdate Button SortSave5 pos={285,YPos},size={65,16},title=SortButton5, proc=SortSaveButtonProc;DelayUpdate Button SortSave6 pos={355,YPos},size={65,16},title=SortButton6, proc=SortSaveButtonProc;DelayUpdate Button SortSave7 pos={425,YPos},size={65,16},title=SortButton7, proc=SortSaveButtonProc;DelayUpdate Button SortSave8 pos={495,YPos},size={65,16},title=SortButton8, proc=SortSaveButtonProc;DelayUpdate Button SortSave9 pos={565,YPos},size={65,16},title=SortButton9, proc=SortSaveButtonProc;DelayUpdate else Button SortSave1 disable=1; Button SortSave2 disable=1; Button SortSave3 disable=1 Button SortSave4 disable=1; Button SortSave5 disable=1; Button SortSave6 disable=1 Button SortSave7 disable=1; Button SortSave8 disable=1; Button SortSave9 disable=1 endif Variable ModeVal if(PlotCh1) Label Ch1 "\\u#2"+StringFromList(str2num(FileWav1)-1, gWaveNames)+"\\u#2" NVAR ZeroLineCh1=root:ChartGlobals:ZeroLineCh1 if(ZeroLineCh1) ModifyGraph zero(Ch1)=1 endif NVAR ModCh1=root:ChartGlobals:ModCh1 NVAR MinCh1=root:ChartGlobals:MinCh1 Wave W=$"root:"+DataFolder+":"+StringFromList(str2num(FileWav1)-1, gWaveNames) if(MinCh1) Wavestats/Q W W+= 0-V_min endif if(ModCh1) ModeVal=ChMode(W) W-= ModeVal endif NVAR ScaleCh1=root:ChartGlobals:ScaleCh1, ppVCh1=root:ChartGlobals:ppVCh1 if(ScaleCh1) NVAR PosYCh1=root:ChartGlobals:PosYCh1 if(PosYCh1) SetAxis Ch1 0,ppVCh1 else SetAxis Ch1 -ppVCh1,ppVCh1 endif endif NVAR HideYCh1=root:ChartGlobals:HideYCh1 if(HideYCh1) ModifyGraph nticks(Ch1)=0, lblRot(Ch1)=-90 else ModifyGraph nticks(Ch1)=3 endif ModifyGraph rgb($StringFromList(str2num(FileWav1)-1, gWaveNames))=(0,1,13107) endif if(PlotCh2) Label Ch2 "\\u#2"+StringFromList(str2num(FileWav2)-1, gWaveNames)+"\\u#2" NVAR ZeroLineCh2=root:ChartGlobals:ZeroLineCh2 if(ZeroLineCh2) ModifyGraph zero(Ch2)=1 endif NVAR ModCh2=root:ChartGlobals:ModCh2 NVAR MinCh2=root:ChartGlobals:MinCh2 Wave W=$"root:"+DataFolder+":"+StringFromList(str2num(FileWav2)-1, gWaveNames) if(MinCh2) Wavestats/Q W W+= 0-V_min endif if(ModCh2) ModeVal=ChMode(W) W-= ModeVal endif NVAR ScaleCh2=root:ChartGlobals:ScaleCh2, ppVCh2=root:ChartGlobals:ppVCh2 if(ScaleCh2) NVAR PosYCh2=root:ChartGlobals:PosYCh2 if(PosYCh2) SetAxis Ch2 0,ppVCh2 else SetAxis Ch2 -ppVCh2,ppVCh2 endif endif NVAR HideYCh2=root:ChartGlobals:HideYCh2 if(HideYCh2) ModifyGraph nticks(Ch2)=0, lblRot(Ch2)=-90 else ModifyGraph nticks(Ch2)=3 endif ModifyGraph rgb($StringFromList(str2num(FileWav2)-1, gWaveNames))=(0,1,13107) endif if(PlotCh3) Label Ch3 "\\u#2"+StringFromList(str2num(FileWav3)-1, gWaveNames)+" \\u#2" NVAR ZeroLineCh3=root:ChartGlobals:ZeroLineCh3 if(ZeroLineCh3) ModifyGraph zero(Ch3)=1 endif NVAR ModCh3=root:ChartGlobals:ModCh3 NVAR MinCh3=root:ChartGlobals:MinCh3 Wave W=$"root:"+DataFolder+":"+StringFromList(str2num(FileWav3)-1, gWaveNames) if(MinCh3) Wavestats/Q W W+= 0-V_min endif if(ModCh3) ModeVal=ChMode(W) W-= ModeVal endif NVAR ScaleCh3=root:ChartGlobals:ScaleCh3, ppVCh3=root:ChartGlobals:ppVCh3 if(ScaleCh3) NVAR PosYCh3=root:ChartGlobals:PosYCh3 if(PosYCh3) SetAxis Ch3 0,ppVCh3 else SetAxis Ch3 -ppVCh3,ppVCh3 endif endif NVAR HideYCh3=root:ChartGlobals:HideYCh3 if(HideYCh3) ModifyGraph nticks(Ch3)=0, lblRot(Ch3)=-90 else ModifyGraph nticks(Ch3)=3 endif ModifyGraph rgb($StringFromList(str2num(FileWav3)-1, gWaveNames))=(0,1,13107) endif if(PlotCh4) Label Ch4 "\\u#2"+StringFromList(str2num(FileWav4)-1, gWaveNames)+"\\u#2" NVAR ZeroLineCh4=root:ChartGlobals:ZeroLineCh4 if(ZeroLineCh4) ModifyGraph zero(Ch4)=1 endif NVAR ModCh4=root:ChartGlobals:ModCh4 NVAR MinCh4=root:ChartGlobals:MinCh4 Wave W=$"root:"+DataFolder+":"+StringFromList(str2num(FileWav4)-1, gWaveNames) if(MinCh4) Wavestats/Q W W+= 0-V_min endif if(ModCh4) ModeVal=ChMode(W) W-= ModeVal endif NVAR ScaleCh4=root:ChartGlobals:ScaleCh4, ppVCh4=root:ChartGlobals:ppVCh4 if(ScaleCh4) NVAR PosYCh4=root:ChartGlobals:PosYCh4 if(PosYCh4) SetAxis Ch4 0,ppVCh4 else SetAxis Ch4 -ppVCh4,ppVCh4 endif endif NVAR HideYCh4=root:ChartGlobals:HideYCh4 if(HideYCh4) ModifyGraph nticks(Ch4)=0, lblRot(Ch4)=-90 else ModifyGraph nticks(Ch4)=3 endif ModifyGraph rgb($StringFromList(str2num(FileWav4)-1, gWaveNames))=(0,1,13107) endif if(PlotCh5) Label Ch5 "\\u#2"+StringFromList(str2num(FileWav5)-1, gWaveNames)+"\\u#2" NVAR ZeroLineCh5=root:ChartGlobals:ZeroLineCh5 if(ZeroLineCh5) ModifyGraph zero(Ch5)=1 endif NVAR ModCh5=root:ChartGlobals:ModCh5 NVAR MinCh5=root:ChartGlobals:MinCh5 Wave W=$"root:"+DataFolder+":"+StringFromList(str2num(FileWav5)-1, gWaveNames) if(MinCh5) Wavestats/Q W W+= 0-V_min endif if(ModCh5) ModeVal=ChMode(W) W-= ModeVal endif NVAR ScaleCh5=root:ChartGlobals:ScaleCh5, ppVCh5=root:ChartGlobals:ppVCh5 if(ScaleCh5) NVAR PosYCh5=root:ChartGlobals:PosYCh5 if(PosYCh5) SetAxis Ch5 0,ppVCh5 else SetAxis Ch5 -ppVCh5,ppVCh5 endif endif NVAR HideYCh5=root:ChartGlobals:HideYCh5 if(HideYCh5) ModifyGraph nticks(Ch5)=0, lblRot(Ch5)=-90 else ModifyGraph nticks(Ch5)=3 endif ModifyGraph rgb($StringFromList(str2num(FileWav5)-1, gWaveNames))=(0,1,13107) endif if(PlotCh6) Label Ch6 "\\u#2"+StringFromList(str2num(FileWav6)-1, gWaveNames)+"\\u#2" NVAR ZeroLineCh6=root:ChartGlobals:ZeroLineCh6 if(ZeroLineCh6) ModifyGraph zero(Ch6)=1 endif NVAR ModCh6=root:ChartGlobals:ModCh6 NVAR MinCh6=root:ChartGlobals:MinCh6 Wave W=$"root:"+DataFolder+":"+StringFromList(str2num(FileWav6)-1, gWaveNames) if(MinCh6) Wavestats/Q W W+= 0-V_min endif if(ModCh6) ModeVal=ChMode(W) W-= ModeVal endif NVAR ScaleCh6=root:ChartGlobals:ScaleCh6, ppVCh6=root:ChartGlobals:ppVCh6 if(ScaleCh6) NVAR PosYCh6=root:ChartGlobals:PosYCh6 if(PosYCh6) SetAxis Ch6 0,ppVCh6 else SetAxis Ch6 -ppVCh6,ppVCh6 endif endif NVAR HideYCh6=root:ChartGlobals:HideYCh6 if(HideYCh6) ModifyGraph nticks(Ch6)=0, lblRot(Ch6)=-90 else ModifyGraph nticks(Ch6)=3 endif ModifyGraph rgb($StringFromList(str2num(FileWav6)-1, gWaveNames))=(0,1,13107) endif // Make calibrated time axis line (get rid of bottom axis, labels and tick marks) variable lx=leftx(Wave1) variable rx=pnt2x(Wave1,numpnts(Wave1)-1) variable duration=rx-lx NVAR DrawCalLine=root:ChartGlobals:DrawCalLine if((DrawCalLine) && (duration <20)) ChDeleteAxisDrawCalLine(lx, rx, duration) endif ModifyGraph tick=2 Label bottom "time (\\U)" NVAR AppendNameAndPath=root:ChartGlobals:AppendNameAndPath if(AppendNameAndPath) ModifyGraph margin(top)=40 //SVAR gRealName=$"root:"+DataFolder+":gRealName" SVAR gFullPath=$"root:"+DataFolder+":gFullPath" String Annotation="\\Z10"+gFullPath//+" "+gRealName NVAR GraphWidth=root:ChartGlobals:GraphWidth variable CharsPerInch=12 if(strlen(Annotation)>(CharsPerInch*GraphWidth)) Annotation=Annotation[0,(CharsPerInch*GraphWidth)/2]+"..."+Annotation[strlen(Annotation)-((CharsPerInch*GraphWidth)/2), strlen(Annotation)] endif TextBox/B=1/E=1/C/N=FileName/X=1.00/Y=-.00/F=0/M/H={0,0,2}/A=LT Annotation endif NVAR CursorAActive=root:ChartGlobals:CursorAActive, CursorBActive=root:ChartGlobals:CursorBActive NVAR ChSel=root:ChartGlobals:ChSel if((CursorAActive || CursorBActive) && ChSel<7 ) UpdateCursors() UpdateCursors() endif End Function ChPopUpProc(ctrlName,popNum,popStr) : PopupMenuControl String ctrlName Variable popNum String popStr NVAR ChSel=root:ChartGlobals:ChSel ChSel=popNum SVAR DSPFunction=root:ChartGlobals:DSPFunction NVAR CursorAActive=root:ChartGlobals:CursorAActive, CursorBActive=root:ChartGlobals:CursorBActive if(CursorAActive || CursorBActive) NVAR isActive=$"root:ChartGlobals:PlotCh"+num2str(ChSel) if(ChSel!= 7 && isActive==0) DoAlert 0, "Select an active channel" return 0 endif if(stringmatch(DSPFunction, "Cursors")) UpdateCursors() UpdateCursors() endif endif return 0 End //----------------------------------------------------------------------- Function ChPlotChart(FileFormat, FileName) Variable FileFormat String FileName Variable PlotSPG=0 String FolderName Switch(FileFormat) case 0: FolderName=ReadBSF(FileName, "1;1;1;1;1;1;1;1;1;1;1;1;1;1", "") break case 1: FolderName=LoadSignalFiles(FileName) break case 2: FolderName=LoadDTFile(FileName) break case 3: FolderName=LoadWavFiles() break default: DoAlert 0, "Unknown file format" endswitch if(strlen(FolderName)<=0) return 0 endif SetDataFolder $"root:"+FolderName SVAR gWaveNames=$"root:"+FolderName+":gWaveNames" Variable numtoplot=0 NVAR PlotCh1=root:ChartGlobals:PlotCh1, PlotCh2=root:ChartGlobals:PlotCh2, PlotCh3=root:ChartGlobals:PlotCh3 NVAR PlotCh4=root:ChartGlobals:PlotCh4, PlotCh5=root:ChartGlobals:PlotCh5, PlotCh6=root:ChartGlobals:PlotCh6 SVAR FileWav1=root:ChartGlobals:FileWav1, FileWav2=root:ChartGlobals:FileWav2, FileWav3=root:ChartGlobals:FileWav3 SVAR FileWav4=root:ChartGlobals:FileWav4, FileWav5=root:ChartGlobals:FileWav5, FileWav6=root:ChartGlobals:FileWav6 if(PlotCh1) numtoplot += 1 endif if(PlotCh2) numtoplot += 1 endif if(PlotCh3) numtoplot += 1 endif if(PlotCh4) numtoplot += 1 endif if(PlotCh5) numtoplot += 1 endif if(PlotCh6) numtoplot += 1 endif NVAR SPGProportion=root:ChartGlobals:SPGProportion Variable TopOfTraces if(PlotSPG) TopOfTraces = 1-SPGProportion else TopOfTraces = 1 endif Variable SizeOfEach = TopOfTraces/numtoplot if(SPGProportion >= 1 && PlotSPG && numtoplot>=1) SPGProportion = 0.5 endif NVAR GraphHeight=root:ChartGlobals:GraphHeight, GraphWidth=root:ChartGlobals:GraphWidth, GraphWidth=root:ChartGlobals:GraphWidth NVAR WindowLeft=root:ChartGlobals:WindowLeft, WindowTop=root:ChartGlobals:WindowTop String GraphTitle=FolderName if(exists("root:"+FolderName+":gRealName")==2) SVAR gRealName=$"root:"+FolderName+":gRealName" GraphTitle=gRealName else GraphTitle=FolderName endif if(stringmatch(GraphTitle[strlen(GraphTitle)-2, strlen(GraphTitle)-2], ".")) GraphTitle=GraphTitle[0, strlen(GraphTitle)-3] endif String WindowList = WinList("*", ";", "WIN:1") if(strsearch(WindowList,FolderName,0)<0 ) Display/K=1/W=(WindowLeft, WindowTop, WindowLeft+GraphWidth*((72/ScreenResolution)*72), WindowTop+GraphHeight*((72/ScreenResolution)*72)) as GraphTitle DoWindow/C $FolderName SetWindow $WinName(0,1) note=FolderName // Set note to name of Sound displayed SetWindow $WinName(0,1), hook=ChWindowEvent;DelayUpdate else DoWindow/F $FolderName endif numtoplot=0 if(PlotCh1) if(!waveexists($stringfromlist(str2num(FileWav1)-1, gWaveNames)) ) DoAlert 0, "Can't find a wave to plot for channel #1. This channel will no longer be plotted." PlotCh1=0 else numtoplot += 1 Variable TopCh1 = TopOfTraces, BottomCh1 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) AppendToGraph/L=Ch1 $stringfromlist(str2num(FileWav1)-1, gWaveNames) ModifyGraph axisEnab(Ch1)={BottomCh1, TopCh1}, freePos(Ch1)=0 endif endif if(PlotCh2) if(!waveexists($stringfromlist(str2num(FileWav2)-1, gWaveNames)) ) DoAlert 0, "Can't find a wave to plot for channel #2. This channel will no longer be plotted." PlotCh2=0 else numtoplot += 1 Variable TopCh2 = TopOfTraces-(SizeOfEach*(numtoplot-1)), BottomCh2 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) AppendToGraph/L=Ch2 $stringfromlist(str2num(FileWav2)-1, gWaveNames) ModifyGraph axisEnab(Ch2)={BottomCh2, TopCh2}, freePos(Ch2)=0 endif endif if(PlotCh3) if(!waveexists($stringfromlist(str2num(FileWav3)-1, gWaveNames)) ) DoAlert 0, "Can't find a wave to plot for channel #3. This channel will no longer be plotted." PlotCh3=0 else numtoplot += 1 Variable TopCh3 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh3 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) AppendToGraph/L=Ch3 $stringfromlist(str2num(FileWav3)-1, gWaveNames) ModifyGraph axisEnab(Ch3)={BottomCh3, TopCh3}, freePos(Ch3)=0 endif endif if(PlotCh4) if(!waveexists($stringfromlist(str2num(FileWav4)-1, gWaveNames)) ) DoAlert 0, "Can't find a wave to plot for channel #4. This channel will no longer be plotted." PlotCh4=0 else numtoplot += 1 Variable TopCh4 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh4 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) AppendToGraph/L=Ch4 $stringfromlist(str2num(FileWav4)-1, gWaveNames) ModifyGraph axisEnab(Ch4)={BottomCh4, TopCh4}, freePos(Ch4)=0 endif endif if(PlotCh5) if(!waveexists($stringfromlist(str2num(FileWav5)-1, gWaveNames)) ) DoAlert 0, "Can't find a wave to plot for channel #5. This channel will no longer be plotted." PlotCh5=0 else numtoplot += 1 Variable TopCh5 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh5 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) AppendToGraph/L=Ch5 $stringfromlist(str2num(FileWav5)-1, gWaveNames) ModifyGraph axisEnab(Ch5)={BottomCh5, TopCh5}, freePos(Ch5)=0 endif endif if(PlotCh6) if(!waveexists($stringfromlist(str2num(FileWav6)-1, gWaveNames)) ) DoAlert 0, "Can't find a wave to plot for channel #6. This channel will no longer be plotted." PlotCh6=0 else numtoplot += 1 Variable TopCh6 = TopOfTraces-(SizeOfEach*(numtoplot-1)) , BottomCh6 = TopOfTraces-((SizeOfEach*numtoplot) - 0.030) AppendToGraph/L=Ch6 $stringfromlist(str2num(FileWav6)-1, gWaveNames) ModifyGraph axisEnab(Ch6)={BottomCh6, TopCh6}, freePos(Ch6)=0 endif endif NVAR TimeAxisDur=root:ChartGlobals:TimeAxisDur if(TimeAxisDur>0) Wave W=$stringfromlist(str2num(FileWav2)-1, gWaveNames) Variable WaveDur=pnt2x(W,numpnts(W)-1)- leftx(W) Variable TimeToAppend=TimeAxisDur-WaveDur SetAxis bottom leftx(W)-(TimeToAppend/2),pnt2x(W,numpnts(W)-1)+(TimeToAppend/2) endif Return 1 End Function ChDeleteAxisDrawCalLine(lx, rx, durr) Variable lx, rx, durr ModifyGraph tick(bottom)=3,noLabel(bottom)=2,axThick(bottom)=0;DelayUpdate String TopGraph=WinName(0,1) //DoWindow/F $TopGraph GetWindow $TopGraph wsize variable lineX1, lineX2, txtYpos = -(1/(V_bottom-V_top))*4000, lineYpos=1.03 if(durr>=10) lineX1 = lx+(durr/2)-1 lineX2 = lineX1+2 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 2.0 sec ";DelayUpdate else if((durr < 10) %& (durr>=5)) lineX1 = lx+(durr/2)-0.5 lineX2 = lineX1+1 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 1.0 sec ";DelayUpdate else if((durr< 5) %& (durr>=2.25)) lineX1 = lx+(durr/2)-0.25 lineX2 = lineX1+0.5 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 500 ms ";DelayUpdate else if((durr<2.25) %& (durr>1.25)) lineX1 = lx+(durr/2)-0.125 lineX2 = lineX1+0.25 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 250 ms ";DelayUpdate else if((durr<=1.25) %& (durr>0.75)) lineX1 = lx+(durr/2)-0.1 lineX2 = lineX1+0.2 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 200 ms ";DelayUpdate else if((durr<=0.75) %& (durr>=0.35)) lineX1 = lx+(durr/2)-0.05 lineX2 = lineX1+0.1 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 100 ms ";DelayUpdate else if((durr<0.35) %& (durr>=0.2)) lineX1 = lx+(durr/2)-0.025 lineX2 = lineX1+0.05 TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 50 ms ";DelayUpdate else if((durr<0.2) %& (durr>=0.075)) lineX1 = lx+(durr/2)-0.0125 lineX2 = lineX1+0.025 DrawText 0.475,(txtYpos),"25 ms";DelayUpdate TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 25 ms ";DelayUpdate else variable shrt_len = round((round(durr*1000)/6))/1000 lineX1 = (lx+(durr/2))-(shrt_len/2) lineX2 = lineX1+shrt_len TextBox/W=$TopGraph/C/N=text0/E=0/F=0/A=MB/X=0.00/Y=(txtYpos) "\\Z12 "+num2str(shrt_len*1000)+" ms " ;DelayUpdate endif endif endif endif endif endif endif endif SetDrawLayer/W=$TopGraph/K UserAxes SetDrawEnv/W=$TopGraph xcoord= bottom,ycoord= prel;DelayUpdate SetDrawEnv/W=$TopGraph linethick= 2.00;DelayUpdate DrawLine/W=$TopGraph lineX1,lineYpos,lineX2,lineYpos;DelayUpdate End Function ChWindowEvent(infoStr) String infoStr String event= StringByKey("EVENT",infoStr) String graphName if(stringmatch(event,"kill")) // Kills ALL cursor variables graphName= WinName(0,1) NVAR WindowLeft=root:ChartGlobals:WindowLeft, WindowTop=root:ChartGlobals:WindowTop GetWindow $graphName wsize WindowLeft=V_left; WindowTop=V_top DoWindow/K $graphName if(DataFolderExists("root:"+graphName )) KillDataFolder $"root:"+graphName endif SetDataFolder root: NVAR CursorAActive=root:ChartGlobals:CursorAActive, CursorBActive=root:ChartGlobals:CursorBActive if(DatafolderExists("root:WinGlobals:"+graphName)) KillDataFolder $"root:WinGlobals:"+graphName endif endif if(stringmatch(event,"activate")) // Kills ALL cursor variables SetDataFolder $"root:"+WinName(0,1) SVAR gWaveNames=gWaveNames SVAR FileWav1=root:ChartGlobals:FileWav1, FileWav2=root:ChartGlobals:FileWav2, FileWav3=root:ChartGlobals:FileWav3 SVAR FileWav4=root:ChartGlobals:FileWav4, FileWav5=root:ChartGlobals:FileWav5, FileWav6=root:ChartGlobals:FileWav6 SVAR WavName1=root:ChartGlobals:WavName1, WavName2=root:ChartGlobals:WavName2, WavName3=root:ChartGlobals:WavName3 SVAR WavName4=root:ChartGlobals:WavName4, WavName5=root:ChartGlobals:WavName5, WavName6=root:ChartGlobals:WavName6 WavName1=stringfromlist(str2num(FileWav1)-1, gWaveNames) WavName2=stringfromlist(str2num(FileWav2)-1, gWaveNames) WavName3=stringfromlist(str2num(FileWav3)-1, gWaveNames) WavName4=stringfromlist(str2num(FileWav4)-1, gWaveNames) WavName5=stringfromlist(str2num(FileWav5)-1, gWaveNames) WavName6=stringfromlist(str2num(FileWav6)-1, gWaveNames) endif NVAR UpdateAxes=root:ChartGlobals:UpdateAxes if(stringmatch(event,"modified") && UpdateAxes) // Kills ALL cursor variables SetDataFolder $"root:"+WinName(0,1) NVAR calibration_line=root:BSoundGlobals:calibration_line if(calibration_line) GetAxis/Q bottom Variable lx=V_min, rx=V_max Variable durr=rx-lx NVAR DrawCalLine=root:ChartGlobals:DrawCalLine if(DrawCalLine && durr <20) ChDeleteAxisDrawCalLine(lx, rx, durr) endif endif GetAxis/Q psd_bottom if(!V_Flag) String DataFolder=WinName(0,1) SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" NVAR SPGWave=root:ChartGlobals:SPGWave String ChName=StringFromList(SPGWave-1, gWaveNames) String TFdB="root:"+DataFolder+":"+PossiblyQuoteName("TFdB_"+ChName) GetAxis/Q SPG NVAR MaxSpgkHz=root:ChartGlobals:MaxSpgkHz, MinSpgkHz=root:ChartGlobals:MinSpgkHz ModifyGraph freePos(psd_bottom)={min(MaxSpgkHz*1000,V_max),SPG} wavestats/Q/R=(MinSpgkHz*1000) $TFdB // skip first 150 Hz when setting scale variable highdB = V_max variable lowdB = V_max - (V_sdev*4) // display values within 3.5 standard deviations of spectrum peak amplitude SetAxis psd_bottom lowdB,highdB endif GetAxis/Q SPG if(!V_Flag) NVAR MaxSpgkHz=root:ChartGlobals:MaxSpgkHz, MinSpgkHz=root:ChartGlobals:MinSpgkHz SetAxis SPG max(MinSpgkHz*1000,V_min),min(MaxSpgkHz*1000,V_max) endif endif return 0 End //**************************************************************** // BSound multichannel files - 12/10/02 //**************************************************************** // FileNameStr - name of file; "" for dialog // WavesToSave - List of waves to save // WaveNames - Names for waves when file is opened // Scale - Scaling factor for integer formats // Header information (12 bytes): // 4 bytes - Version // 4 bytes - HeaderSize // 4 bytes - Channels // Channel information (70 bytes * # channels): // 3 chars - Y units // 3 chars - X units // 20 chars - Wave Name // 12 chars - Reserved // 4 bytes - Format // 4 bytes - Points in wave // 4 bytes - Delta X (1/sample rate) // 4 bytes - Left X // 4 bytes - Scale // 12 chars - Reserved // Waves (up to 14 sequencial waves after1024 byte header): // Write Waves sequencially // ... Function WriteBSF(FileNameStr, WavesToSave, WaveNames, lx, rx, Scale, Dialog) String FileNameStr, WavesToSave, WaveNames Variable lx, rx, Scale, Dialog Variable Version=10, HeaderSize=1024, Channels=itemsinlist(WavesToSave) if(Channels!=itemsinlist(WaveNames)) DoAlert 0, "Wrong number of wave names" return 0 endif Variable i, format, pnts, dx String info, str, YUnitsStr, XUnitsStr, WaveNamestr, LabelStr //NewPath/Q/O SavePath "Macintosh HD:Users:brian:Desktop:" Variable refNum if(Dialog) Open/D/Z=2/P=SavePath/M="Save multichannel .bsf file"/T=".bsf" refNum FileNameStr if(strlen(S_fileName)<1) return 0 endif Open/Z=2/P=SavePath refNum S_fileName else Open/Z=2/P=SavePath refNum FileNameStr endif if(V_Flag<0) return 0 endif str=""; str=PadString(str, HeaderSize, 0) FBinWrite/B=3 refNum, str FSetPos refNum, 0 // Write General file header info. FBinWrite/B=3/F=4 refNum, Version // Version number FBinWrite/B=3/F=4 refNum, HeaderSize // Header size FBinWrite/B=3/F=4 refNum, Channels // Channels // Write Channel header info. for(i=0;i0) DoWindow $WinName(0,1) if(V_flag && !stringmatch(WinName(0,1), "ChartSettings" ) && !stringmatch(WinName(0,1), "ChCursorDisplay" )&& !stringmatch(WinName(0,1), "ChannelNames" )) ControlInfo FileFormat if(V_flag==3) PopupMenu FileFormat mode=FileFormat+1;delayupdate endif endif endif // update settings window DoWindow ChartSettings if(V_flag) PopupMenu FileFormat win=ChartSettings, mode=FileFormat+1;delayupdate ControlUpdate/W=ChartSettings FileFormat endif End //---------------------------------------------------------------------------- Function DoDSPFunction(ctrlName) : ButtonControl String ctrlName Variable CH=str2num(ctrlName[7,7])-1 String DataFolder=WinName(0,1) SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" Wave W=$"root:"+DataFolder+":"+stringfromlist(CH, gWaveNames) Variable LP=x2pnt(W, leftx(W)), RP=x2pnt(W, pnt2x(W,numpnts(W)-1)) ApplyFunction(CH, LP, RP) End //---------------------------------------------------------------------------- Function ChartSpectrogramClear() String images=WaveList("TF_*",";","WIN:") if(strlen(images)<=0) DoAlert 0, "There is no spectrogram image" return 0 endif images=StringFromList(0, images) Wave SPG=$"root:"+WinName(0,1)+":"+PossiblyQuoteName(images) GetMarquee SPG, bottom if(V_Flag==0) return 0 endif Variable r, c Variable Lft=(V_left-DimOffSet(SPG,0))/DimDelta(SPG,0), Rht=(V_right-DimOffSet(SPG,0))/DimDelta(SPG,0), Top=V_top/DimDelta(SPG,1), Btm=V_bottom/DimDelta(SPG,1) for(r=Lft;r<=Rht;r+=1) for(c=Btm;c<=Top;c+=1) SPG[r][c]=NaN endfor endfor End //---------------------------------------------------------------------------- Function ChartSpectrogramNaN(Ave) Variable Ave String images=WaveList("TF_*",";","WIN:") if(strlen(images)<=0) DoAlert 0, "There is no spectrogram image" return 0 endif images=StringFromList(0, images) Wave SPG=$"root:"+WinName(0,1)+":"+PossiblyQuoteName(images) ImageStats SPG Variable SPGthresh= V_avg if(Ave) Prompt SPGthresh, "Threshold Z Spectrogram value ("+"Avg="+num2str(V_avg)+", Min="+num2str(V_min)+", Max="+num2str(V_max)+")" DoPrompt "Threshold" SPGthresh if(V_Flag) return 0 endif endif SPG=(SPG= 0) Wave Wav=$"root:"+DataFolder+":"+StringFromList(i, gWaveNames) Wav[x2pnt(Wav, V_left), x2pnt(Wav, V_right)]=NaN endif endfor if(strsearch(ImagesInGraph, "TF_",0) >= 0) Wave Wav=$TF Wav[x2pnt(Wav, V_left), x2pnt(Wav, V_right)]=NaN endif if(strsearch(TracesInGraph, "HP_",0) >= 0) Wave Wav=$HP Wav[x2pnt(Wav, V_left), x2pnt(Wav, V_right)]=NaN endif if(strsearch(TracesInGraph, "RMS_",0) >= 0) Wave Wav=$RMS Wav[x2pnt(Wav, V_left), x2pnt(Wav, V_right)]=NaN endif else DoAlert 0, "No Marquee selection" endif endif End //---------------------------------------------------------------------------- Function CropDeleteTime(CropDelete) Variable CropDelete String DataFolder=WinName(0,1) SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" NVAR SPGWave=root:ChartGlobals:SPGWave String ChName=StringFromList(SPGWave-1, gWaveNames) String W="root:"+DataFolder+":"+ChName String TF="root:"+DataFolder+":"+PossiblyQuoteName("TF_"+ChName) String HP="root:"+DataFolder+":"+PossiblyQuoteName("HP_"+ChName) String RMS="root:"+DataFolder+":"+PossiblyQuoteName("RMS_"+ChName) String ImagesInGraph = ImageNameList(DataFolder, ";") String TracesInGraph = TraceNameList(DataFolder, ";", 1) GetMarquee bottom if(V_Flag) Variable i for(i=0;i= 0) FDeleteMarqueeData($StringFromList(i, gWaveNames), CropDelete, 1) endif endfor if(strsearch(ImagesInGraph, "TF_",0) >= 0) FDeleteMarqueeData($TF, CropDelete, 1) endif if(strsearch(TracesInGraph, "HP_",0) >= 0) FDeleteMarqueeData($HP, CropDelete, 1) endif if(strsearch(TracesInGraph, "RMS_",0) >= 0) FDeleteMarqueeData($RMS, CropDelete, 1) endif else DoAlert 0, "No Marquee selection" endif End Function ApplyFunction(CH, LP, RP) Variable CH, LP, RP SVAR gWaveNames=$"root:"+WinName(0,1)+":gWaveNames" String WaveStr="root:"+WinName(0,1)+":"+stringfromlist(CH, gWaveNames) Wave W=$WaveStr SVAR DSPFunction=root:ChartGlobals:DSPFunction NVAR FunctionValue=root:ChartGlobals:FunctionValue StrSwitch(DSPFunction) case "Spectrum (A)": PlotSpectrumAtCursorA() break case "Resample": Resample(WaveStr) break case "Spectrum": UpdateSpectrum(CH, LP, RP) break case "Cursors": UpdateCursors() break case "Normalize": Wavestats/Q/R=[LP,RP] W W[LP,RP] *= FunctionValue/V_max break case "Pitch": ChartGetPitch() break case "Crop": CropDeleteTime(2) break case "Delete": CropDeleteTime(1) break case "SPG clear": ChartSpectrogramClear() break case "SPG threshold": ChartSpectrogramNaN(1) break case "Multiply": W[LP,RP]*=FunctionValue break case "Divide": W[LP,RP]/=FunctionValue break case "Add": W[LP,RP]+=FunctionValue break case "Subtract": W[LP,RP]-=FunctionValue break case "Zero at Min": Wavestats/Q W W+= 0-V_min break case "Zero at Mode": Variable ModeVal= ChMode(W) W-= ModeVal break case "FIR filter": FilterW("root:"+WinName(0,1)+":"+stringfromlist(CH, gWaveNames)) break case "Smooth": Smooth (FunctionValue), W break default: DoAlert 0, "Function "+DSPFunction+" unkown" endswitch End //------------------------------------------------------------------------ Function SetDSPFunction(ctrlName,popNum,popStr) : PopupMenuControl String ctrlName Variable popNum String popStr SVAR DSPFunction=root:ChartGlobals:DSPFunction DSPFunction=popStr End //------------------------------------------------------------------------ Function FilterW(Wstr) String Wstr String dfSav= GetDataFolder(1) // Save data folder SetDatafolder root: String FIRcoef Prompt FIRcoef,"Select FIR coefficients (or load new coefficients)",popup, "Load new coefs;"+WaveList("*",";","") DoPrompt "Filter", FIRcoef if(V_Flag) return 0 endif if(stringmatch(FIRcoef,"Load new coefs")) Variable refNum Open/R/Z=0/M="Open FIR coefficients file"/T="????" refNum String FIRfilePathName=S_Filename if(strlen(S_fileName)<=0) Print "Error opening file (FIR coefs)" return 0 endif Close refNum String FIRfileName = StringFromList(ItemsInList(FIRfilePathName,":")-1, FIRfilePathName, ":") String FIRfilePath = RemoveFromList(FIRfileName, FIRfilePathName, ":") NewPath/O/Q FIRPath, FIRfilePath LoadWave/Q/O/P=FIRPath FIRfilePathName FIRcoef = stringfromlist(0,S_waveNames) endif ApplyFIRfilter(Wstr,FIRcoef) //BSound function call SetDatafolder dfSav End //------------------------------------------------------------------------ Function WindowDSPFunction(ctrlName,popNum,popStr) : PopupMenuControl String ctrlName Variable popNum String popStr String DataFolder=WinName(0,1) SVAR DSPFunction=root:ChartGlobals:DSPFunction DSPFunction=popStr if(stringmatch(DSPFunction, "Cursors")) ApplyFunction(0, 0, 0) return 0 endif NVAR ChSel=root:ChartGlobals:ChSel NVAR isActive=$"root:ChartGlobals:PlotCh"+num2str(ChSel) if(ChSel!=0 && isActive==0) DoAlert 0, "Select an active channel" return 0 endif SVAR ChStr=$"root:ChartGlobals:FileWav"+num2str(ChSel) Variable ChNum=str2num(ChStr) //NVAR PlotCh1=root:ChartGlobals:PlotCh1, PlotCh2=root:ChartGlobals:PlotCh2, PlotCh3=root:ChartGlobals:PlotCh3 //NVAR PlotCh4=root:ChartGlobals:PlotCh4, PlotCh5=root:ChartGlobals:PlotCh5, PlotCh6=root:ChartGlobals:PlotCh6 Variable CH=ChNum SVAR gWaveNames=$"root:"+DataFolder+":gWaveNames" Wave W=$"root:"+DataFolder+":"+stringfromlist(CH-1, gWaveNames) Variable LP=0, RP= numpnts(W)-1 // Use cursors if they exist if(exists("root:WinGlobals:"+DataFolder+":S_CursorAInfo" )) SVAR CursorAStr=$"root:WinGlobals:"+DataFolder+":S_CursorAInfo" LP=x2pnt(W, hcsr(A)) endif if(exists("root:WinGlobals:"+DataFolder+":S_CursorBInfo" )) SVAR CursorBStr=$"root:WinGlobals:"+DataFolder+":S_CursorBInfo" RP=x2pnt(W, hcsr(B)) endif // Marquee overrides cursors GetMarquee bottom if(V_flag) LP=x2pnt(W, V_left); RP=x2pnt(W, V_right) endif ApplyFunction(CH-1, LP, RP) End //------------------------------------------------------------------------ function ChMode(W) Wave W NVAR ppV=root:ChartGlobals:ppV duplicate/O W, temp Histogram/B={-ppV,ppV/100000,200000} W, temp wavestats/Q temp Killwaves temp return V_maxloc End //------------------------------------------------------------------------ Function ZeroLineProc(ctrlName,checked) : CheckBoxControl String ctrlName Variable checked String CH=ctrlName[6,6] NVAR ZeroLineCh=$"root:ChartGlobals:ZeroLineCh"+CH ZeroLineCh=checked End //------------------------------------------------------------------------ Function ZeroMinModeProc(ctrlName,checked) : CheckBoxControl String ctrlName Variable checked String CHstr=ctrlName[5,5] Variable isMin=0 NVAR lMode= $"root:ChartGlobals:ModCh"+CHstr NVAR lMin= $"root:ChartGlobals:MinCh"+CHstr if(stringmatch(ctrlName[0,2], "Min")) isMin=1 endif if(isMin) if(checked) lMin=1 lMode=0 else lMin=0 endif else if(checked) lMode=1 lMin=0 else lMode=0 endif endif End //------------------------------------------------------------------------ Function SPGChProc(ctrlName,checked) : CheckBoxControl String ctrlName Variable checked Variable ChSel strswitch (ctrlName) case "SPGCh1": ChSel= 1 break case "SPGCh2": ChSel= 2 break case "SPGCh3": ChSel= 3 break case "SPGCh4": ChSel= 4 break case "SPGCh5": ChSel= 5 break case "SPGCh6": ChSel= 6 break endswitch CheckBox SPGCh1,value= ChSel==1 CheckBox SPGCh2,value= ChSel==2 CheckBox SPGCh3,value= ChSel==3 CheckBox SPGCh4,value= ChSel==4 CheckBox SPGCh5,value= ChSel==5 CheckBox SPGCh6,value= ChSel==6 SVAR ChStr=$"root:ChartGlobals:FileWav"+num2str(ChSel) NVAR SPGWave= root:ChartGlobals:SPGWave SPGWave=str2num(ChStr) End //------------------------------------------------------------------------ Function UpdateSpectrum(CH, LP, RP) Variable CH, LP, RP NVAR SPGWave=root:ChartGlobals:SPGWave SVAR gWaveNames=$"root:"+WinName(0,1)+":gWaveNames" Wave W=$"root:"+WinName(0,1)+":"+stringfromlist(SPGWave-1, gWaveNames) Wave TF=$"root:"+WinName(0,1)+":TF_"+stringfromlist(SPGWave-1, gWaveNames) Wave TFHz=$"root:"+WinName(0,1)+":TFHz_"+stringfromlist(SPGWave-1, gWaveNames) Wave TFdB=$"root:"+WinName(0,1)+":TFdB_"+stringfromlist(SPGWave-1, gWaveNames) Variable LeftSel=pnt2x(W, LP) Variable RightSel=pnt2x(W, RP) GetAxis/W=$WinName(0,1) /Q SPG if(WaveExists(TF ) && !V_flag) TFdB = 0 Variable dx = dimdelta(TF,0) Variable dx_step = dx*floor(LeftSel/dx) Variable num_ffts = 0 do TFdB += TF(dx_step)[p] dx_step += dx num_ffts += 1 while(dx_step <= dx*ceil(RightSel/dx)) TFdB[] /= num_ffts // calculate average TFdB[] = 20*log(TFdB/0.00002) // make log scale if(V_flag) // if not displayed ChDisplaySpectrum() endif else Duplicate/O/R=(LeftSel,RightSel) W, root:BSoundGlobals:temp BSCalcSpectrum("temp") Wave PSD=root:BSoundGlobals:psd_temp Duplicate/O PSD, $"TFdB_"+stringfromlist(SPGWave-1, gWaveNames) ChDisplaySpectrum() return 0 endif NVAR MinSpgkHz=root:ChartGlobals:MinSpgkHz wavestats/Q/R=(MinSpgkHz*1000) TFdB Variable highdB = V_max Variable lowdB = V_max - (V_sdev*4) // display values within 5 standard deviations of spectrum peak amplitude GetAxis/W=$WinName(0,1) /Q SPG if(!V_Flag) SetAxis psd_bottom lowdB, highdB endif End //------------------------------------------------------------------------ Function ChDisplaySpectrum() NVAR SPGWave=root:ChartGlobals:SPGWave SVAR gWaveNames=$"root:"+WinName(0,1)+":gWaveNames" Wave TFdB=$"root:"+WinName(0,1)+":TFdB_"+stringfromlist(SPGWave-1, gWaveNames) SetScale/P x leftx(TFdB),deltax(TFdB),"Hz", TFdB SetScale d, 0, 0, "dB", TFdB GetMarquee/K bottom DoWindow/K Spectrum Display/K=1 TFdB as stringfromlist(SPGWave-1, gWaveNames)+" Spectrum" DoWindow/C Spectrum ModifyGraph rgb=(0,0,0), tick=2, standoff=0, lblMargin=5;DelayUpdate Label left "amplitude (\\U)";DelayUpdate Label bottom "frequency (\\U)" End //------------------------------------------------------------------------ Function UpdateCursors() NVAR ChSel=root:ChartGlobals:ChSel NVAR SPGWave=root:ChartGlobals:SPGWave, AutoSpectrogram=root:ChartGlobals:AutoSpectrogram DoUpdate GetAxis/Q SPG //Printf "%g, %g, %g\r", ChSel, V_flag, AutoSpectrogram if(ChSel>6 && V_flag )// && AutoSpectrogram) //V_flag=0 if SPG axis exists ChSel=SPGWave //DoAlert 0, "Cursor error: spectrogram is not displayed" endif Variable CH=ChSel if(CH>0 && CH <=6) SVAR FileWavStr=$"root:ChartGlobals:FileWav"+num2str(ChSel) CH=str2num(FileWavStr) endif String TopWindowStr=WinName(0,1) SVAR gWaveNames=$"root:"+TopWindowStr+":gWaveNames" if(ChSel==7) GetAxis/Q SPG if(V_flag) return 0 endif Wave W=$"root:"+TopWindowStr+":"+stringfromlist(SPGWave-1, gWaveNames) else Wave W=$"root:"+TopWindowStr+":"+stringfromlist(CH-1, gWaveNames) endif NVAR CursorAActive=root:ChartGlobals:CursorAActive, CursorBActive=root:ChartGlobals:CursorBActive if(!CursorAActive || !CursorBActive) Variable CenterTime=LeftX(W)+(RightX(W)-LeftX(W))/2 Variable CenterTimeA=CenterTime-(CenterTime*0.01) Variable CenterTimeB=CenterTime+(CenterTime*0.01) if(ChSel>0 && CH <=6) // not spectrogram Cursor/A=1/H=1/S=2/C=(65535,0,0) A, $Stringfromlist(CH-1, gWaveNames) CenterTimeA Cursor/A=1/H=1/S=2/C=(3,52428,1) B, $Stringfromlist(CH-1, gWaveNames) CenterTimeB else WaveStats/Q $"root:"+TopWindowStr+":TF_"+stringfromlist(SPGWave-1, gWaveNames) Cursor/A=1/I/H=1/S=2/C=(3,52428,1) B, $"TF_"+stringfromlist(SPGWave-1, gWaveNames) CenterTimeB, V_maxColLoc+250 WaveStats/Q $"root:"+TopWindowStr+":TF_"+stringfromlist(SPGWave-1, gWaveNames) Cursor/A=1/I/H=1/S=2/C=(65535,0,0) A, $"TF_"+stringfromlist(SPGWave-1, gWaveNames) CenterTimeA, V_maxColLoc-250 endif CursorAActive=1 CursorBActive=1 ChartCursorDependency() if(ChSel>0 && CH <=6) // not spectrogram Cursor/A=1/H=1/S=2/C=(65535,0,0) A, $Stringfromlist(CH-1, gWaveNames) CenterTimeA Cursor/A=1/H=1/S=2/C=(3,52428,1) B, $Stringfromlist(CH-1, gWaveNames) CenterTimeB else WaveStats/Q $"root:"+TopWindowStr+":TF_"+stringfromlist(SPGWave-1, gWaveNames) Cursor/A=1/I/H=1/S=2/C=(3,52428,1) B, $"TF_"+stringfromlist(SPGWave-1, gWaveNames) CenterTimeB, V_maxColLoc+250 WaveStats/Q $"root:"+TopWindowStr+":TF_"+stringfromlist(SPGWave-1, gWaveNames) Cursor/A=1/I/H=1/S=2/C=(65535,0,0) A, $"TF_"+stringfromlist(SPGWave-1, gWaveNames) CenterTimeA, V_maxColLoc-250 endif NVAR ChSel=root:ChartGlobals:ChSel PopupMenu ChPopUp mode=ChSel //ShowInfo/W=$TopWindowStr Doupdate else CursorAActive=0 Cursor/K A CursorBActive=0 Cursor/K B HideInfo/W=$TopWindowStr if(DataFolderExists("root:WinGlobals:"+TopWindowStr)) KillDataFolder $"root:WinGlobals:"+TopWindowStr endif NVAR ChSel=root:ChartGlobals:ChSel PopupMenu ChPopUp mode=ChSel endif return 0 End Function ChartCursorDependency() String graphName= WinName(0,1) if( strlen(graphName) ) String df= GetDataFolder(1); NewDataFolder/O root:WinGlobals NewDataFolder/O/S root:WinGlobals:$graphName String/G S_CursorAInfo, S_CursorBInfo Variable/G dependentA SetFormula dependentA, "ChartCursorAMoved(S_CursorAInfo, S_CursorBInfo)" Variable/G dependentB SetFormula dependentB,"ChartCursorBMoved(S_CursorAInfo, S_CursorBInfo)" SetDataFolder df endif End Function ChartCursorAMoved(AInfo, BInfo) String AInfo, BInfo NVAR CursorAWaveX=root:ChartGlobals:CursorAWaveX, CursorAWaveY=root:ChartGlobals:CursorAWaveY NVAR CursorBWaveX=root:ChartGlobals:CursorBWaveX, CursorBWaveY=root:ChartGlobals:CursorBWaveY NVAR CursorA_BWaveX=root:ChartGlobals:CursorA_BWaveX, CursorA_BWaveY=root:ChartGlobals:CursorA_BWaveY if(exists("root:WinGlobals:"+WinName(0,1)+":S_CursorAInfo" )>0 && exists("root:WinGlobals:"+WinName(0,1)+":S_CursorBInfo" )) SVAR CursorAStr=$"root:WinGlobals:"+WinName(0,1)+":S_CursorAInfo" if(strlen(StringByKey("TNAME", CursorAStr))>0) CursorAWaveX=hcsr(A) CursorAWaveY=vcsr(A) CursorA_BWaveX=hcsr(A)-hcsr(B) CursorA_BWaveY=vcsr(A)-vcsr(B) endif endif return 0 End Function ChartCursorBMoved(AInfo, BInfo) String AInfo, BInfo NVAR CursorAWaveX=root:ChartGlobals:CursorAWaveX, CursorAWaveY=root:ChartGlobals:CursorAWaveY NVAR CursorBWaveX=root:ChartGlobals:CursorBWaveX, CursorBWaveY=root:ChartGlobals:CursorBWaveY NVAR CursorA_BWaveX=root:ChartGlobals:CursorA_BWaveX, CursorA_BWaveY=root:ChartGlobals:CursorA_BWaveY if(exists("root:WinGlobals:"+WinName(0,1)+":S_CursorBInfo" ) && exists("root:WinGlobals:"+WinName(0,1)+":S_CursorAInfo" )) SVAR CursorBStr=$"root:WinGlobals:"+WinName(0,1)+":S_CursorBInfo" if(strlen(StringByKey("TNAME", CursorBStr))>0) CursorBWaveX=hcsr(B) CursorBWaveY=vcsr(B) CursorA_BWaveX=hcsr(A)-hcsr(B) CursorA_BWaveY=vcsr(A)-vcsr(B) endif endif return 0 End Window ChCursorDisplay() CheckChGlobals() Silent 1 DoWindow/K ChCursorDisplay NewPanel/K=1 /W=(430,50,618,163) as "Cursor Display" SetDrawEnv fname= "Arial",fstyle= 1 DrawText 25,37,"A:" ValDisplay CursorA pos={30,20},size={75,18},frame=5, fsize=12, bodyWidth=65, title="", format="%.3f", value=#root:ChartGlobals:CursorAWaveY ValDisplay CursorAX pos={100,20},size={75,18},frame=5, fsize=12, bodyWidth=65, title="", format="%.3f", value=#root:ChartGlobals:CursorAWaveX SetDrawEnv fname= "Arial",fstyle= 1 DrawText 25,67,"B:" ValDisplay CursorB pos={30,50},size={75,18},frame=5, fsize=12, bodyWidth=65, title="", format="%.3f", value=#root:ChartGlobals:CursorBWaveY ValDisplay CursorBX pos={100,50},size={75,18},frame=5, fsize=12, bodyWidth=65, title="", format="%.3f", value=#root:ChartGlobals:CursorBWaveX SetDrawEnv fname= "Arial",fstyle= 1 DrawText 5,97,"A-B:" ValDisplay CursorA_B pos={30,80},size={75,18},frame=5, fsize=12, bodyWidth=65, title="", format="%.3f", value=#root:ChartGlobals:CursorA_BWaveY ValDisplay CursorA_BX pos={100,80},size={75,18},frame=5, fsize=12, bodyWidth=65, title="", format="%.3f", value=#root:ChartGlobals:CursorA_BWaveX SetDrawEnv fname= "Arial",fstyle= 1 DrawText 74,18,"Y" SetDrawEnv fname= "Arial",fstyle= 1 DrawText 133,18,"X" End Function PlayChartProc(ctrlName) : ButtonControl String ctrlName NVAR SPGWave=root:ChartGlobals:SPGWave SVAR gWaveNames=$"root:"+WinName(0,1)+":gWaveNames" Wave W=$"root:"+WinName(0,1)+":"+stringfromlist(SPGWave-1, gWaveNames) //Display W; return 0 Variable LP=0, RP= numpnts(W)-1 // Use cursors if they exist if(exists("root:WinGlobals:"+WinName(0,1)+":S_CursorAInfo" )) SVAR CursorAStr=$"root:WinGlobals:"+WinName(0,1)+":S_CursorAInfo" LP=x2pnt(W, hcsr(A)) endif if(exists("root:WinGlobals:"+WinName(0,1)+":S_CursorBInfo" )) SVAR CursorBStr=$"root:WinGlobals:"+WinName(0,1)+":S_CursorBInfo" RP=x2pnt(W, hcsr(B)) endif // Marquee overrides cursors GetMarquee bottom if(V_flag) LP=x2pnt(W, V_left); RP=x2pnt(W, V_right) endif Duplicate/O/R=[LP, RP] W , temp wavestats/Q temp temp *= 20000/V_max Redimension/W temp Playsound/A=2 temp Killwaves temp End Function StopChartProc(ctrlName) : ButtonControl String ctrlName Make/O/N=2 Dummy SetScale/P x 0,1/44100,"sec", Dummy Playsound/A=2 Dummy End //--------------------------------------------------------------------------- Function/T LoadSignalFiles(FileToLoad) String FileToLoad Variable WriteBSFKill PathInfo/S LoadPath if(strlen(FileToLoad)<=0) FileToLoad="" else FileToLoad=S_path+FileToLoad endif SetDataFolder root: String SignalFilePathName=BSLoadSignalHeaderInfo(FileToLoad) // Load Header info. and get path to file if(strlen(SignalFilePathName)<=0) return "" endif String SignalFileName = StringFromList(ItemsInList(SignalFilePathName,":")-1, SignalFilePathName, ":") String SignalFilePath = RemoveFromList(SignalFileName, SignalFilePathName, ":") NewPath/O/Q LoadPath, SignalFilePath Wave RealElements=root:SignalFileInfo:RealHeaderElements Wave/T ASCIIElement=root:SignalFileInfo:ASCIIHeaderElements Variable NHBLKS=RealElements[0] Variable NDBLKS=RealElements[1] Variable CONV_FACTOR=RealElements[2] Variable OFFSET=RealElements[3] Variable TPNTS=RealElements[4] Variable SRATE=RealElements[5] Variable XLOW=RealElements[6] String PRM_STAMP=ASCIIElement[1] String PRM_VERSION=ASCIIElement[2] String BUFFER_TYPE=ASCIIElement[3] String DATA_TYPE=ASCIIElement[4] if(!stringmatch(PRM_STAMP,"SIGP")) DoAlert 0, "This does not appear to be a Signal file (i.e., a SIGP file)" return "" endif if(stringmatch(BUFFER_TYPE,"T ")) DoAlert 0, "This does not appear to be a Signal time buffer" return "" endif String ListOfAllFiles="", SigFileName="", str="", BlockFiles="" Variable i, NumFiles=1 ListOfAllFiles=IndexedFile(LoadPath,-1,"????") NumFiles=ItemsInList(ListOfAllFiles) SigFileName = SignalFileName[0,(strsearch(SignalFileName,".",0))-1] for(i=0;i<=NumFiles;i+=1) str=StringFromList(i,ListOfAllFiles) if ( (strSearch(str, SigFileName, 0) >= 0) ) BlockFiles += lowerstr(str)+";" endif endfor NumFiles=ItemsInList(BlockFiles) String DataFolderName=SignalFileName[0,strsearch(SignalFileName,".",0)-1] if(numtype(str2num(DataFolderName[0,0]))==0) DataFolderName="S_"+DataFolderName endif for(i=0;i<=strlen(DataFolderName);i+=1) if(stringmatch(DataFolderName[i,i],"-")==1 || stringmatch(DataFolderName[i,i]," ")==1 || stringmatch(DataFolderName[i,i],".")==1 || stringmatch(DataFolderName[i,i],":")==1 || stringmatch(DataFolderName[i,i],";")==1 || stringmatch(DataFolderName[i,i],"'")==1 || stringmatch(DataFolderName[i,i],"\"")==1) DataFolderName[i,i]="_" endif endfor String/G root:gSignalFilePathName="" SVAR gSignalFilePathName=root:gSignalFilePathName gSignalFilePathName=SignalFilePathName String ChXInfo="", tempfilename="", blkStr, ChName="" NVAR PrefixblkNum=root:ConversionGlobals:PrefixblkNum SVAR IDName=root:ConversionGlobals:IDName Variable/G root:gNHBLKS=NHBLKS SVAR SignalChName1=root:ChartGlobals:SignalChName1, SignalChName2=root:ChartGlobals:SignalChName2, SignalChName3=root:ChartGlobals:SignalChName3 SVAR SignalChName4=root:ChartGlobals:SignalChName4, SignalChName5=root:ChartGlobals:SignalChName5, SignalChName6=root:ChartGlobals:SignalChName6 //Printf "-%s, %s, %s, %s, %s, %s\r", SignalChName1, SignalChName2, SignalChName3, SignalChName4, SignalChName5, SignalChName6 String WavesLoaded="" for(i=0;i0 && AOT[f+1]-AOT[f]<0 && AOT[f]-AOT[f-2]>0 && AOT[f]-AOT[f+2]>0) firstPnt=f-2 lastPnt=f+2 break endif endfor // interpolate and get location (time) of first peak duplicate/O/R=[firstPnt,lastPnt] AutoOut, Int if(lastPnt-firstPnt >=3) execute "Interpolate/T=3/N=4000/F=1/Y=int_SS int" wave int_SS=int_SS WaveStats/Q int_SS //Printf "%g\r", V_maxloc peak=V_maxloc if(peak<(1/LowHz) && peak>(1/HighHz) ) if(peak<(1/MinAccurateHz)) HzOut[i]=1/peak else HzOut[i]=1/peak PotentialErrors+=0 endif else HzOut[i]=NaN endif RMSOut[i]=RMS else HzOut[i]=NaN RMSOut[i]=RMS SeriousErrors+=1 //return 0 endif endif //threshold endfor KillWaves/Z InputSound,Seg,Win,Int,int_SS,AutoOut, AOT if(PotentialErrors>=1 || SeriousErrors>=1) String AlertStr if(PotentialErrors>=1 && SeriousErrors<=1) SPrintf AlertStr, "%g potential error(s) were reported. Window length should be longer than %g to find peaks below %g Hz", PotentialErrors, WindowDur, (1/WindowDur)*3 else SPrintf AlertStr, "%g serious undersampling(s) were reported. Window length should be longer than %g to find peaks below %g Hz", SeriousErrors, WindowDur, (1/WindowDur)*3 endif if(PotentialErrors>=1 && SeriousErrors>=1) SPrintf AlertStr, "%g serious undersampling(s) and %g potential error(s) were reported. Window length should be longer than %g to find peaks below %g Hz," SeriousErrors, PotentialErrors, WindowDur, (1/WindowDur)*3 endif DoAlert 0, AlertStr endif string Platform = IgorInfo(2) // use when platform related issues arise String TraceList = TraceNameList("",";",1) GetAxis/Q SPG if(!V_Flag) if(strsearch(TraceList,"HP_",0)<0) AppendToGraph/L=SPG HzOut;DelayUpdate ModifyGraph mode($NameOfWave(HzOut))=3,marker($NameOfWave(HzOut))=19;DelayUpdate ModifyGraph msize($NameOfWave(HzOut))=0.5,mrkThick($NameOfWave(HzOut))=0.5 if(stringmatch(platform, "Macintosh")) ModifyGraph mrkThick($NameOfWave(HzOut))=0 endif endif //if(strsearch(TraceList,"RMS_",0)<0) // NVAR SPGWave=root:ChartGlobals:SPGWave // AppendToGraph/L=$"Ch"+num2str(SPGWave) RMSOut;DelayUpdate //endif endif // make a new graph if(V_Flag) Display/K=1 HzOut ModifyGraph tick=2,fSize=12,highTrip=99, rgb=(52428,1,1) Label left "frequency (\\U)";DelayUpdate Label bottom "time (\\U)";DelayUpdate GetAxis/Q left Variable adj=(V_max-V_min)*0.15 SetAxis left V_min-adj,V_max+adj;DelayUpdate ModifyGraph mode($NameOfWave(HzOut))=3,marker($NameOfWave(HzOut))=19;DelayUpdate ModifyGraph msize($NameOfWave(HzOut))=0.5,mrkThick($NameOfWave(HzOut))=0.5 if(stringmatch(platform, "Macintosh")) ModifyGraph mrkThick($NameOfWave(HzOut))=0 endif endif SetDataFolder dfSav End Function MakeMyColors() Wave TF_Sound=$"root:"+WinName(0,1)+":TF_Sound" imagestats TF_Sound BlueColorIndexWave(65535,V_min,V_max) ModifyImage TF_Sound cindex= myColors End Function BlueColorIndexWave(numberOfColors,zMin,zMax) Variable numberOfColors Variable zMin,zMax // from min, max of contour or image data Make/O/N=(numberOfColors,3) myColors Variable white=65535 // black is zero Variable colorStep= white/(numberOfColors-1) myColors[][0]=(colorStep*(numberOfColors-1-p))/5 // R colorStep*p // increases myColors[][1]= (colorStep*(numberOfColors-1-p))/5 // G colorStep*(numberOfColors-1-p) // decreases myColors[][2]= (colorStep*(numberOfColors-1-p))/2 // B SetScale/I x,zMin,zMax,myColors // Match X scaling to Z range End Function BlueRedColorIndexWave(numberOfColors,zMin,zMax) Variable numberOfColors Variable zMin,zMax // from min, max of contour or image data Make/O/N=(numberOfColors,3) myColors Variable white=65535 // black is zero Variable colorStep= white/(numberOfColors-1) myColors[][0]= colorStep*p // red increases with row number, myColors[][1]= 0 // no green myColors[][2]= colorStep*(numberOfColors-1-p) // blue decreases SetScale/I x,zMin,zMax,myColors // Match X scaling to Z range End DoWindow ChartSettings // Remember window position if the window exists if(V_flag) GetWindow ChartSettings wsize DoWindow/K ChartSettings NewPanel /K=1 /W=(V_left,V_top,V_right,V_bottom) as "Chart Settings" else DoWindow/K ChartSettings NewPanel/K=1/W=(50,100,598,435) as "Chart Settings" endif Window ChannelNames() : Panel CheckChGlobals() PauseUpdate; Silent 1 // building window... DoWindow ChannelNames // Remember window position if the window exists if(V_flag) GetWindow ChannelNames wsize DoWindow/K ChannelNames NewPanel /K=1 /W=(V_left,V_top,V_right,V_bottom) as "Signal" else DoWindow/K ChannelNames NewPanel/K=1/W=(546,184,690,440) as "Signal" endif SetDrawLayer UserBack SetDrawEnv fsize= 10 DrawText 9,17,"Signal/DT file wave names" SetVariable Ch1SigName,pos={10,27},size={120,15},title="Ch .1" SetVariable Ch1SigName,value= root:ChartGlobals:SignalChName1 SetVariable Ch2SigName,pos={10,49},size={120,15},title="Ch .2" SetVariable Ch2SigName,value= root:ChartGlobals:SignalChName2 SetVariable Ch3SigName,pos={10,72},size={120,15},title="Ch .3" SetVariable Ch3SigName,value= root:ChartGlobals:SignalChName3 SetVariable Ch4SigName,pos={10,95},size={120,15},title="Ch .4" SetVariable Ch4SigName,value= root:ChartGlobals:SignalChName4 SetVariable Ch5SigName,pos={10,118},size={120,15},title="Ch .5" SetVariable Ch5SigName,value= root:ChartGlobals:SignalChName5 SetVariable Ch6SigName,pos={10,141},size={120,15},title="Ch .6" SetVariable Ch6SigName,value= root:ChartGlobals:SignalChName6 SetDrawEnv fsize= 10;DelayUpdate; DrawText 30,183,"DT file variables:" SetVariable SRate,pos={7,191},size={127,15},title="S. Rate (Hz)" SetVariable SRate,value= root:ChartGlobals:SRateDT SetVariable Scale,pos={14,211},size={120,15},title="Scale (/=)" SetVariable Scale,value= root:ChartGlobals:ScaleDT SetVariable NumChannels,pos={14,231},size={120,15},title="# Channels" SetVariable NumChannels,value= root:ChartGlobals:NumDTChannels EndMacro Function ConvertAllSignalsToBSFs() Variable refNum Open/D/R/Z=2/T="????"/M="Select Signal files" refNum if(strlen(S_fileName)<1) return 0 endif String SelectedFileName = StringFromList(ItemsInList(S_fileName,":")-1, S_fileName, ":") String SelectedFilePath = RemoveFromList(SelectedFileName, S_fileName, ":") NewPath/C/O/Q LoadPath, SelectedFilePath NewPath/C/O/Q SavePath, SelectedFilePath+"BSF Files" String ListOfFiles= IndexedFile(LoadPath,-1, "????") String FileName, LastName Variable i for(i=0;i=0) String NewName=NameStr+"-" Prompt NewName, "New file name" Prompt OverWrite, "OverWrite?", popup, "Yes;No" DoPrompt "File already exists", NewName, OverWrite if(V_Flag==0) if(WhichListItem(NewName+".bsf", SortedFileList)<0 || StringMatch(OverWrite, "Yes") ) NameStr=NewName NameUsed=0 endif else return 0 endif else NameUsed=0 endif while(NameUsed) Printf "%s, %s (%g to %g)\r", Type, NameStr, lx, rx String LocalWaveNames=gWaveNames //OPTIONAL - Change a channel name // Variable ItemNum // if(WhichListItem("LeftFlow", LocalWaveNames)>=0) // ItemNum=WhichListItem("LeftFlow",LocalWaveNames) // LocalWaveNames=RemoveFromList("LeftFlow",LocalWaveNames) // LocalWaveNames=AddListItem("RightFlow",LocalWaveNames,";",ItemNum) // else // if(WhichListItem("RightFlow", LocalWaveNames)>=0) // ItemNum=WhichListItem("RightFlow",LocalWaveNames) // LocalWaveNames=RemoveFromList("RightFlow",LocalWaveNames) // LocalWaveNames=AddListItem("LeftFlow",LocalWaveNames,";",ItemNum) // endif // endif WriteBSF(NameStr+".bsf", gWaveNames, LocalWaveNames, lx, rx, 1, FileSortDialog) break default: case 1: NameStr=gRealName[0,strlen(gRealName)-3] Variable refNum Open/D/C="????"/M="Save signal files (extension added automatically!)" refNum as NameStr if(strlen(S_fileName)<=0) return 0 endif String FileName = StringFromList(ItemsInList(S_fileName,":")-1, S_fileName, ":") String FilePath=RemoveFromList(FileName, S_fileName, ":") Variable i for(i=0;i10) //DoAlert 0, "The file name "+FileSaveName+"is too long. Try "+FileSaveName[0,10] FileSaveName=FileSaveName[0,10] endif String Platform = IgorInfo(2) // use when platform related issues arise Variable refNum Open/Z=2/M="Base Name for WAV files"/T="????" refNum as FileSaveName if(!V_Flag==0 || refNum==0) DoAlert 0, "An error occured. Quit Igor and reopen the experiment" return 0 endif String FileName = StringFromList(ItemsInList(S_fileName,":")-1, S_fileName, ":") String FilePath = RemoveFromList(FileName, S_fileName, ":") FileSaveName=StringFromList(0, BlockList); FileSaveName=FileName String FinalPath if(stringmatch(Platform, "Macintosh")) NewPath/C/O/Q SavePath, FilePath+FileSaveName+" AIFs" FinalPath=FilePath+FileSaveName+" AIFs" else NewPath/C/O/Q SavePath, FilePath+FileSaveName+" WAVs" FinalPath=FilePath+FileSaveName+" WAVs" endif String YUnits, info Variable i, k do FileSaveName=StringFromList(0, BlockList); FileSaveName=FileName+" "+FileSaveName[strlen(FileSaveName)-3, strlen(FileSaveName)]//+".bsf" WaveNameList="" for(i=0;i29) DoAlert 0, FileSaveName+" truncated to "+FileSaveName[0,25] FileSaveName=FileSaveName[0,25] endif Variable refNum Open/Z=2/M="Base Name for BSF files"/T="????" refNum as FileSaveName if(!V_Flag==0 || refNum==0) return 0 endif String FileName = StringFromList(ItemsInList(S_fileName,":")-1, S_fileName, ":") String FilePath = RemoveFromList(FileName, S_fileName, ":") NewPath/C/O/Q SavePath, FilePath+FileSaveName+" BSFs" Variable i do FileSaveName=StringFromList(0, BlockList); FileSaveName=FileName+" "+FileSaveName[strlen(FileSaveName)-3, strlen(FileSaveName)]+".bsf" WaveNameList="" for(i=0;i