' CreateMATFile - Create a Matlab5 compatible *.mat file from the current data set and markers. ' Author: Dr. Ingmar Gutberlet, (c) BlindSight Consulting, 2002 / Date of work start: 6.9.2002 ' This macro includes adaptations of several routines from a macro named "Matlab" by Dr. Achim Hornecker. ' $Id: CreateMATFile.vabs,v 1.6 2002-09-07 20:53:35+01 gutberle Exp gutberle $ '--------------------------------------------------------------------------------------------------------- ' SYNOPSIS: This macro automatically creates a Matlab5 compatible MAT file from the data of the ' currently active history node. - The name of the file is built from the currently active history ' files's name and the currently active history nodes' name. The location for the MAT file is determined ' from the user constant "MatFileDir", which, if empty, defaults to the current export files folder. ' Please note that any spaces found in the file name are substituted by underscore characters "_". ' ' EEGDATA: The way data is exported depends on the type of data present and on the status of the user ' variable "MatFileSegmented". If "MatFileSegmented" ist set to "True" and the dataset is found ' to be segmented, all channel data is written to the MAT file as segmented data in a two ' dimensional array CH(SegmentCount,SegmentDataPoints). For nonsegmented datasets, channel data ' is written in form of a one-dimensional data vector. ' Note: Even for segmented data, "MatFileSegmented" can be set to "False" in order to have data ' written as a one-dimensional vector. Please note though, that there will be discontinuities ' at the segment borders and that the time vector "t" (see below" will not reflect the times ' within each segment, but the overall position of each datapoint. This is NOT the TIME of the ' datapoints recording, but only a millisecond based index to the data vector. ' Complex data is exported as complex data to Matlab and can be manipulated with the complex ' algebra operations built into Matlab. ' MARKERS: If data is written in nonsegmented fashion, markers are written in form of a one-dimensional ' vector as well. Marker positions will be general pointers to the markers withing the dataset ' in form of the data point count at the markers occurrence. If data is written in segmented ' fashion, Markers will be written as a two-dimensional array MK(SegmentCount,SegmentMarkers). ' If segmented markers are used, marker positions will be adjusted to pointers of the respective ' marker's occurrence within the segment (not the dataset). ' TIMEAXIS: The time axis is always written as a one-dimensional vector of millisecond values, or in the ' case of frequency values, as Hertz values. If EEGData is written in nonsegmented fashion, the ' time or frequency axis is incremented for the entire length of the dataset. Please note that ' this would produce wrong frequency values if the dataset was in fact segmented, but is to be ' written in nonsegmented fashion. In these cases, where the user needs segmented data to be ' written as nonsegmented vector data, the user must assure correct time/frequency information ' to be used him/herself. ' For time data, the x-Axis is named "t", for frequency data the vector is named f. The user ' can use these vectors for correct plotting of data, for example 'plot(t, Fp1)' in matlab). ' CHANNELS: Here, channels means the polar channel positions. These data are written as structured arrays ' with the polar coordinates RADIUS, THETA and PHI as well as the channels true name in form of ' a structured array. Positions are written as a one-dimensional vector Channels(ChannelCount). ' ' Additionally, the macro exports the following variables with general parameters of the dataset: ' ' ChannelCount : Number of channels in dataset. ' SegmentCount : Number of segments in dataset. ' MarkerCount : Number of markers in dataset. ' SampleRate : Sample rate of current dataset. ' ' Use matlab command 'whos' for a list of exported data. ' ' The user can use a small number of constants at the head of the macro code to modify the macro's ' operation of the macro. These constants, their meanings and default valuesare: ' ' Const MatFileDirectory = "" ' Directory for MAT files. Defaults to ExportFileFolder. ' Const MatFileSegmented = True ' Write data and markers into two dimensional arrays? ' Const MatlabWaitStart = 1 ' Time to wait for Matlab to inititalize in seconds. ' ' A new history node is created in order to make this macro available for calling from history templates. ' The new history normally has the name CreateMATFile. However, if a node or nodes by this name already ' exist(s), the node name is incremented starting with an index of 2, thus replicating Analyzer behavior. ' ' CONTACT: For any suggestions, questions or bug reports, please contact support@brainproducts.com '---------------------------------------------------------------------------------------------------------- Const MatFileDirectory = "C:" ' Directory for MAT files. Defaults to ExportFileFolder. Const MatFileSegmented = True ' Write data and markers into two dimensional arrays? Const MatlabWaitStart = 1 ' Time to wait for Matlab to inititalize in seconds. '---------------------------------------------------------------------------------------------------------- Option Explicit Const VersionID = "$Revision: 1.6 $" ' Macro revision, automatically updated by RCS repository. Const ProgramID = "CreateMATFile" ' Name of the macro. Used for alerts and message boxes. ' Matlab variables... Dim Matlab As Object ' Matlab object variable for OLE communication. Dim MatlabCommand As String ' Matlab command string for markers, coordinates, commands. Dim MatFilePath As String ' Path variable for newly created *.MAT files. Dim MatFileNamePath As String ' File and path of newly created *.MAT file. Dim MReal() As Double ' Complex data real part. Dim MImag() As Double ' Complex data imaginary part. Dim bComplex As Boolean ' Flag indicating if data is complex. Dim bFreq As Boolean ' Flag indicating if data is frequency data. ' Dataset variables... Dim ds As Dataset ' Dataset object. Points to ActiveNode Dim mk As Marker ' Marker object for writing markers to Matlab. Dim ch As Channel ' Channel object for writing channel positions to Matlab. Dim pos As ChannelPosition ' Position object for writing channel positions to Matlab. Dim nhn As New NewHistoryNode ' New history node object for dummy node creation. Dim NewNodeName As String ' Name of history node to be created. Dim DatasetLength As Long ' Length of current dataset as number of points. Dim DatasetMaxLength As Long ' Length of longest segment with manually set segments. Dim DataIsSegmented As Boolean ' Flag indicating whether data is properly segmented. Dim SamplingInterval As Double ' Sample interval of current dataset. Dim DataType As Long ' Current dataset's data type (time vs. frequency domain). Dim DataPointNum As Long ' Currently processed data point. Dim ChannelData() As Single ' Channel data array for copying data to Matlab. Dim ChannelNum As Long ' Currently processed channel by number. Dim ChannelCount As Long ' Total number of channels. Dim ChannelName As String ' Name of current channel as seen by Matlab. Dim ChannelNames() As String ' Array with original channel names from current dataset. Dim ChannelPrefix As String ' Channel name prefix for nonalphanumeric channel names. Dim MarkerNum As Long ' Currently processed marker by number. Dim MarkerCount As Long ' Total number of markers in dataset. Dim SegmentNum As Long ' Currently processed segment by number. Dim SegmentCount As Long ' Total number of segments in dataset. Dim SegmentMarkerNum As Long ' Currently processed marker for segmented data. Dim SegmentMarkerCount As Long ' Number of markers in a given segment. Dim SegmentDatasetStart () As Long ' Starting points of dataset segments in data points. Dim SegmentDatasetLength () As Long ' Length of dataset segments in data points. ' Helper variables for GUI elements... Dim PercentArray (0) As String ' Dummy Array for progress display. Dim ProgressPhase As Long ' Phase of copying data, marker, ... Sub Main ' Initialize global error handling... On Error GoTo CheckError ' Initialize some needed general variables... InitVariables ' Create a matlab object MsgBoxNonModal ProgramID & "...", "Please wait while Matlab is being started..." ' Clear the Matlab workspace MatlabCommand = "clear;" Matlab.Execute(MatlabCommand) ' Check, if the node name CompareNodes already exists and change name accordingly... NewNodeName = ValidChildNodeName(ActiveNode,ProgramID) ' And set up the new history node for creation... nhn.Create NewNodeName, ActiveNode, "", True ' Read the current dataset's properties... ReadDatasetProperties ' Set the file name and path for the MAT file... MatFilePath = Trim(MatFileDirectory) If (MatFilePath = "") Then MatFilePath = CurrentWorkspace.ExportFileFolder If (Right(MatFilePath,1) = "\") Then MatFilePath = Left(MatFilePath,Len(MatFilePath)-1) If (Dir$(MatFilePath & "\*.*") = "") Then Error 1002 MatFileNamePath = LCase(MatFilePath & "\" & Replace(ActiveNode.HistoryFile.Name & "_" & ActiveNode.Name & ".mat",Chr(32),"_")) ' ShowProgress dialog which calls the actual data processing routines ShowProgressDialog ProgramID & "...", "Copying data to Matlab:" ' Write markers to matlab ShowProgressDialog ProgramID & "...", "Copying markers to Matlab:" ' And append the axis matrix to the existing MAT file... MatlabCommand = "save '" & MatFileNamePath & "' Markers -APPEND;" Matlab.Execute(MatlabCommand) ' Check if we have a MAT file, else exit with error... If (Dir$(MatFileNamePath) = "") Then Error 1001 ' Write x-axis to matlab AxisToMatlab ' Write coordinates to matlab CoordinatesToMatlab ' Write coordinates to matlab DatasetParamsToMatlab ' Build the description string for the new history node... BuildParamString ' Clear all dynamically created variables... ClearVariables ' Finish creating the new history node... nhn.Finish ' Globally used error checking routines... CheckError: Beep Dim nError As Long nError = Err.Number And &h7fff ' Extract pure error code... Select Case nError Case 1001 ' Writing the *.mat file failes... MsgBox "Writing the *.mat file failed. - Please check your dataset for errors... !", vbCritical, ProgramID Case 1002 ' The directory for the MAT files does not exist... MsgBox "The directory you specified for the MAT files does not exist !", vbCritical, ProgramID Case 1503 ' No dataset open and selected MsgBox "This macro requires an active history node for operation!", vbCritical, ProgramID Case 10095 ' Matlab could not be started. MsgBox "Matlab could not be started - Please make sure Matlab is installed on this computer !", vbCritical, ProgramID Case Else ' Unexpected or unknown error occurred... MsgBox "Error No. " & nError & ": "&Error(nError) & " Please contact the support team.", vbCritical, ProgramID End Select End Sub ' Definition of the dialog to be shown during the processing of data... Public Sub ShowProgressDialog(RunTitle As String, RunMessage As String) Begin Dialog UserDialog 310,63,RunTitle,.ProgressDialog ' %GRID:10,7,1,1 Text 30,14,170,14,RunMessage,.RundlgTxt ListBox 200,11,70,21,PercentArray(),.PercentOK CancelButton 120,35,80,21 End Dialog Dim Rundlg As UserDialog PercentArray(0) = " 00.0%" If Dialog(Rundlg) = 0 Then Exit All End Sub ' Dialog function servicing the processing of data... Public Function ProgressDialog%(DlgItem$, Action%, SuppValue%) Dim PercentFinished As Double Select Case Action% Case 1 ' Dialog box initialization ProgressPhase = ProgressPhase + 1 ChannelNum = 0 MarkerNum = 0 SegmentNum = 0 DlgFocus "Cancel" Case 2 ' Value changing or button pressed If (DlgItem$ = "Cancel") Then ProgressDialog% = False ' exit the dialog End If Case 4 ' Focus changed Case 5 ' Idle Select Case ProgressPhase Case 1 PercentFinished = DataToMatlab Case 2 PercentFinished = MarkersToMatlab End Select If PercentFinished <= 100.0 Then PercentArray(0) = Format$(PercentFinished/100," 00.0%") DlgListBoxArray "PercentOK", PercentArray() ProgressDialog% = (PercentFinished < 100.0) If (ProgressDialog% = False) Then DlgEnd 1000 End If Else ProgressDialog% = False DlgEnd 1000 End If DlgFocus "Cancel" Case 6 ' Function key End Select End Function ' Definition of the dialog to be shown during the processing of data... Public Sub MsgBoxNonModal(RunTitle As String, RunMessage As String) Begin Dialog UserDialog 310,63,RunTitle,.MsgBoxNonModalDialog ' %GRID:10,7,1,1 Text 30,14,250,14,RunMessage,.RundlgTxt CancelButton 120,35,80,21 End Dialog Dim Rundlg As UserDialog If Dialog(Rundlg) = 0 Then Exit All End Sub ' Dialog function servicing the processing of data... Public Function MsgBoxNonModalDialog%(DlgItem$, Action%, SuppValue%) Select Case Action% Case 1 ' Dialog box initialization DlgFocus "Cancel" Case 2 ' Value changing or button pressed If (DlgItem$ = "Cancel") Then MsgBoxNonModalDialog% = False ' exit the dialog End If Case 5 ' Idle MsgBoxNonModalAction MsgBoxNonModalDialog% = False DlgEnd 1000 End Select End Function ' Execute a command while the message box remains on screen... Sub MsgBoxNonModalAction Dim StartTime As Double Set Matlab = CreateObject("Matlab.Application") Wait MatlabWaitStart End Sub ' Read the dataset properties, channel names and data type... Sub ReadDatasetProperties Set ds = ActiveNode.Dataset DataType = ds.Type SamplingInterval = ds.SamplingInterval ChannelCount = ds.Channels.Count MarkerCount = ds.Markers.Count SegmentCount = ActiveNode.Segments.Count DatasetLength = ds.Length DataIsSegmented = ((ds.SegmentationType <> viStNotSegmented) And (ds.Averaged = False)) If ((MatFileSegmented = True) And (DataIsSegmented = True)) Then DatasetLength = (DatasetLength/ActiveNode.Segments.Count) ReDim SegmentDatasetStart(SegmentCount) ReDim SegmentDatasetLength(SegmentCount) ' Establish the maximum segment size and the segment start points... If (MatFileSegmented = True) Then If (ds.SegmentationType = viStManual) Then If (DataIsSegmented = True) Then DatasetMaxLength = 0 For SegmentNum = 1 To SegmentCount If (ActiveNode.Segments(SegmentNum).Dataset.Length > DatasetMaxLength) Then DatasetMaxLength = ActiveNode.Segments(SegmentNum).Dataset.Length End If Next SegmentNum Else DatasetMaxLength = DatasetLength End If ' Establish the segment start and time0 points... SegmentNum = 0 For MarkerNum = 1 To MarkerCount Set mk = ds.Markers(MarkerNum) ' Record the new segment position... If (mk.Type = "New Segment") Then SegmentNum = SegmentNum + 1 SegmentDatasetStart(SegmentNum) = mk.Position SegmentDatasetLength(SegmentNum) = ActiveNode.Segments(SegmentNum).Dataset.Length End If Next MarkerNum Else ' Dataset either is not segmented or segmented into equal sized segments... For SegmentNum = 1 To SegmentCount SegmentDatasetStart(SegmentNum) = (((SegmentNum-1)*DatasetLength)+1) SegmentDatasetLength(SegmentNum) = DatasetLength Next SegmentNum ' And finally, set the maximum dataset length to one segment's length... DatasetMaxLength = DatasetLength End If Else DatasetMaxLength = DatasetLength End If ' Collect the channel names and make Matlab compatible... ReDim ChannelNames(1 To ChannelCount) For ChannelNum = 1 To ChannelCount ChannelNames(ChannelNum) = ds.Channels(ChannelNum).Name Dim a As Integer a = Asc(Left(ChannelNames(ChannelNum), 1)) If Not((Asc("a") <= a And a <= Asc("z")) Or (Asc("A") <= a And a <= Asc("Z"))) Then ChannelPrefix = "C" Next ChannelNum If DataType = viDtTimeDomainComplex Or DataType = viDtFrequencyDomainComplex Then bComplex = True Else bComplex = False End If If DataType = viDtFrequencyDomain Or DataType = viDtFrequencyDomainComplex Then bFreq = True Else bFreq = False End If End Sub ' Write current history node's data to Matlab... Function DataToMatlab ' Increment the channel number with each call of the function... ChannelNum = ChannelNum + 1 ' Clear the Matlab workspace for the new channel data... MatlabCommand = "clear;" Matlab.Execute(MatlabCommand) ' If this is the first channel, then redim the arrays... If ChannelNum = 1 Then If ((MatFileSegmented = True) And (DataIsSegmented = True)) Then ReDim MReal(SegmentCount-1,DatasetMaxLength-1) If bComplex Then ReDim MImag(SegmentCount-1,DatasetMaxLength-1) Else ReDim MReal(DatasetLength-1) If bComplex Then ReDim MImag(DatasetMaxLength-1) End If End If ' Get the channel data, and fill the Matlab matrix... If ((MatFileSegmented = True) And (DataIsSegmented = True)) Then For SegmentNum = 1 To SegmentCount ActiveNode.Dataset.Channels(ChannelNum).GetData SegmentDatasetStart(SegmentNum), SegmentDatasetLength(SegmentNum), ChannelData If (DatasetMaxLength > SegmentDatasetLength(SegmentNum)) Then ReDim Preserve ChannelData(DatasetMaxLength) For DataPointNum = 1 To DatasetMaxLength If bComplex Then MReal(SegmentNum-1,DataPointNum-1) = ChannelData(2*DataPointNum-1) MImag(SegmentNum-1,DataPointNum-1) = ChannelData(2*DataPointNum) Else MReal(SegmentNum-1,DataPointNum-1) = ChannelData(DataPointNum) End If Next DataPointNum Next SegmentNum Else ActiveNode.Dataset.Channels(ChannelNum).GetData 1, DatasetLength, ChannelData For DataPointNum = 1 To DatasetLength If bComplex Then MReal(DataPointNum-1) = ChannelData(2*DataPointNum-1) MImag(DataPointNum-1) = ChannelData(2*DataPointNum) Else MReal(DataPointNum-1) = ChannelData(DataPointNum) End If Next DataPointNum End If ChannelName = ChannelPrefix + ChannelNames(ChannelNum) Matlab.PutFullMatrix ChannelName, "base", MReal, MImag ' And append or write the new variable to the MAT file... If ChannelNum = 1 Then MatlabCommand = "save '" & MatFileNamePath & "' " & ChannelName & ";" Else MatlabCommand = "save '" & MatFileNamePath & "' " & ChannelName & " -APPEND;" End If Matlab.Execute(MatlabCommand) ' Check if we have a MAT file, else exit with error... If (Dir$(MatFileNamePath) = "") Then Error 1001 ' Establish the percentage of channels finished... DataToMatlab = ((ChannelNum/ChannelCount)*100) End Function ' Write current history node's markers to Matlab... Function MarkersToMatlab If ((MatFileSegmented = True) And (DataIsSegmented = True)) Then SegmentNum = SegmentNum + 1 SegmentMarkerCount = ActiveNode.Segments(SegmentNum).Dataset.Markers.Count For SegmentMarkerNum = 1 To SegmentMarkerCount MarkerNum = MarkerNum + 1 Set mk = ActiveNode.Segments(SegmentNum).Dataset.Markers(SegmentMarkerNum) ' Write channel number MatlabCommand = "Markers(" + Trim(Str(SegmentNum)) & "," & Trim(Str(SegmentMarkerNum)) + ").Chan = " + Trim(Str(mk.ChannelNumber)) + ";" Matlab.Execute(MatlabCommand) ' Write Description MatlabCommand = "Markers(" + Trim(Str(SegmentNum)) & "," & Trim(Str(SegmentMarkerNum)) + ").Description = '" + Trim(mk.Description) + "';" Matlab.Execute(MatlabCommand) ' Write Points MatlabCommand = "Markers(" + Trim(Str(SegmentNum)) & "," & Trim(Str(SegmentMarkerNum)) + ").Points = " + Trim(Str(mk.Points)) + ";" Matlab.Execute(MatlabCommand) ' Write Position MatlabCommand = "Markers(" + Trim(Str(SegmentNum)) & "," & Trim(Str(SegmentMarkerNum)) + ").Position = " + Trim(Str(mk.Position-SegmentDatasetStart(SegmentNum)+1)) + ";" Matlab.Execute(MatlabCommand) ' Write Type MatlabCommand = "Markers(" + Trim(Str(SegmentNum)) & "," & Trim(Str(SegmentMarkerNum)) + ").Type = '" + Trim(mk.Type) + "';" Matlab.Execute(MatlabCommand) Next SegmentMarkerNum Else MarkerNum = MarkerNum + 1 Set mk = ActiveNode.Dataset.Markers(MarkerNum) ' Write channel number MatlabCommand = "Markers(" + Str(MarkerNum) + ").Chan = " + Trim(Str(mk.ChannelNumber)) + ";" Matlab.Execute(MatlabCommand) ' Write Description MatlabCommand = "Markers(" + Str(MarkerNum) + ").Description = '" + Trim(mk.Description) + "';" Matlab.Execute(MatlabCommand) ' Write Points MatlabCommand = "Markers(" + Str(MarkerNum) + ").Points = " + Trim(Str(mk.Points)) + ";" Matlab.Execute(MatlabCommand) ' Write Position MatlabCommand = "Markers(" + Str(MarkerNum) + ").Position = " + Trim(Str(mk.Position)) + ";" Matlab.Execute(MatlabCommand) ' Write Type MatlabCommand = "Markers(" + Str(MarkerNum) + ").Type = '" + Trim(mk.Type) + "';" Matlab.Execute(MatlabCommand) End If ' Establish the percentage of markers finished... If ((MatFileSegmented = True) And (DataIsSegmented = True)) Then MarkersToMatlab = ((SegmentNum/SegmentCount)*100) Else MarkersToMatlab = ((MarkerNum/MarkerCount)*100) End If End Function ' Write current history node's time or frequency axis to Matlab... Sub AxisToMatlab Dim AxisMatrixName As String Dim Time0Pos As Long Dim AxisStartTime As String Dim AxisStopTime As String Dim AxisIncrement As String ' Clear the Matlab workspace for the axis matrix data... MatlabCommand = "clear;" Matlab.Execute(MatlabCommand) ' Find the time 0 time point... Time0Pos = FindTime0 - 1 ' Set the start and stop times If bFreq Then AxisMatrixName = "f" AxisStartTime = Trim(Str(-(Time0Pos) * SamplingInterval)) AxisStopTime = Trim(Str(((DatasetLength-1) - Time0Pos) * SamplingInterval)) AxisIncrement = Trim(Str(SamplingInterval)) Else AxisMatrixName = "t" AxisStartTime = Trim(Str(-(Time0Pos) * SamplingInterval * 1e-3)) AxisStopTime = Trim(Str(((DatasetLength-1) - Time0Pos) * SamplingInterval * 1e-3)) AxisIncrement = Trim(Str((SamplingInterval * 1e-3))) End If ' Write the axis time or frequency matrix and transpose it... MatlabCommand = AxisMatrixName & "=" & AxisStartTime & ":" & AxisIncrement & ":" & AxisStopTime & ";" Matlab.Execute(MatlabCommand) MatlabCommand = AxisMatrixName & "=" & AxisMatrixName & "';" Matlab.Execute(MatlabCommand) ' And append the axis matrix to the existing MAT file... MatlabCommand = "save '" & MatFileNamePath & "' " & AxisMatrixName & " -APPEND;" Matlab.Execute(MatlabCommand) ' Check if we have a MAT file, else exit with error... If (Dir$(MatFileNamePath) = "") Then Error 1001 End Sub ' Write current history nodes' coordinates to Matlab... Sub CoordinatesToMatlab ' Clear the Matlab workspace for the axis matrix data... MatlabCommand = "clear;" Matlab.Execute(MatlabCommand) ' And run through all channels, collecting the coordinates into the Matlab matrix... For ChannelNum = 1 To ChannelCount Set Pos = ds.Channels(ChannelNum).Position MatlabCommand = "Channels(" + Str(ChannelNum) + ").Phi = " + Str(Pos.Phi) + ";" Matlab.Execute(MatlabCommand) MatlabCommand = "Channels(" + Str(ChannelNum) + ").Theta = " + Str(Pos.Theta) + ";" Matlab.Execute(MatlabCommand) MatlabCommand = "Channels(" + Str(ChannelNum) + ").Radius = " + Str(Pos.Radius) + ";" Matlab.Execute(MatlabCommand) MatlabCommand = "Channels(" + Str(ChannelNum) + ").Name = '" + ds.Channels(ChannelNum).Name + "';" Matlab.Execute(MatlabCommand) Next ' And append the axis matrix to the existing MAT file... MatlabCommand = "save '" & MatFileNamePath & "' Channels -APPEND;" Matlab.Execute(MatlabCommand) ' Check if we have a MAT file, else exit with error... If (Dir$(MatFileNamePath) = "") Then Error 1001 End Sub ' Write current history nodes' coordinates to Matlab... Sub DatasetParamsToMatlab ' Clear the Matlab workspace for the axis matrix data... MatlabCommand = "clear;" Matlab.Execute(MatlabCommand) ' Set and save some general variables to the MAT file... MatlabCommand = "ChannelCount = " + Trim(Str(ChannelCount)) + ";" Matlab.Execute(MatlabCommand) MatlabCommand = "SegmentCount = " + Trim(Str(SegmentCount)) + ";" Matlab.Execute(MatlabCommand) MatlabCommand = "MarkerCount = " + Trim(Str(MarkerCount)) + ";" Matlab.Execute(MatlabCommand) MatlabCommand = "SampleRate = " + Trim(Str(1000000/SamplingInterval)) + ";" Matlab.Execute(MatlabCommand) ' And append the axis matrix to the existing MAT file... MatlabCommand = "save '" & MatFileNamePath & "' ChannelCount SegmentCount MarkerCount SampleRate -APPEND;" Matlab.Execute(MatlabCommand) ' Check if we have a MAT file, else exit with error... If (Dir$(MatFileNamePath) = "") Then Error 1001 End Sub ' Find the first Time0 marker in this dataset... Function FindTime0() As Long Dim Pos As Long Pos = 1 For MarkerNum = 1 To MarkerCount Set mk = ds.Markers(MarkerNum) If mk.Type = "Time 0" Then Pos = mk.Position Exit For End If Next FindTime0 = Pos End Function ' Build the NewHistoryNode description string... Function BuildParamString As String Dim nhnString As String nhnString = "*** " & ProgramID & " - Version " & Mid$(VersionID,12,InStr(12,VersionID," ")-12) & " / Dr. Ingmar Gutberlet, (c) BlindSight Consulting, 2002 ***" & vbCrLf nhnString = nhnString & "-------------------------------------------------------------------------------------------" & vbCrLf nhnString = nhnString & vbCrLf nhnString = nhnString & "MAT file was written to: " & MatFileNamePath & vbCrLf & vbCrLf nhn.Description = nhnString End Function ' Takes a history node name and searches the child node names for the next valid node name... Function ValidChildNodeName (SearchNode As HistoryNode, SearchName As String) As String Dim hnChild As HistoryNode Dim hnChildNum As Long Dim SearchNameExt As String Dim FileCount As Long FileCount = 1 SearchNameExt = "" Do For hnChildNum = 1 To SearchNode.HistoryNodes.Count If (SearchNode.HistoryNodes(hnChildNum).Name = SearchName & SearchNameExt) Then FileCount = FileCount + 1 SearchNameExt = " " & FileCount Exit For End If Next hnChildNum Loop Until (hnChildNum > SearchNode.HistoryNodes.Count) ValidChildNodeName = SearchName & SearchNameExt End Function ' Initialize some needed general variables... Sub InitVariables ChannelPrefix = "" ProgressPhase = 0 End Sub ' Clear all dynamically allocated variables and objects... Sub ClearVariables Set Matlab = Nothing Set ds = Nothing Set mk = Nothing Set ch = Nothing Set pos = Nothing Erase ChannelData Erase MReal Erase MImag Erase ChannelNames Erase SegmentDatasetStart Erase SegmentDatasetLength End Sub