Data AcQuisition And Real-Time Analysis
Scope - Spectrum - Spectrogram - Signal Generator
Software for Windows
Science with your Sound Card!
The following is from the Daqarta Help system:



Spectrum Analyzer

Signal Generator

(Absolutely FREE!)


Pitch Tracker


DaqMusiq Generator
(Free Music... Forever!)

Engine Simulator

LCR Meter

Remote Operation

DC Measurements

True RMS Voltmeter

Sound Level Meter

Frequency Counter
    Spectral Event

    MHz Frequencies

Data Logger

Waveform Averager


Post-Stimulus Time
Histogram (PSTH)

THD Meter

IMD Meter

Precision Phase Meter

Pulse Meter

Macro System

Multi-Trace Arrays

Trigger Controls


Spectral Peak Track

Spectrum Limit Testing

Direct-to-Disk Recording



Frequency response

Distortion measurement

Speech and music

Microphone calibration

Loudspeaker test

Auditory phenomena

Musical instrument tuning

Animal sound

Evoked potentials

Rotating machinery


Product test

Contact us about
your application!

Macro String Arrays

Each macro array Buf0-7 is a collection of 1024 elements. Each element normally holds a 64-bit numerical value, but that same 64 bit element can instead hold up to 8 ASCII text characters. Elements can be accessed individually or in groups of 2, 4, or 8 to provide string arrays of up to 8, 16, 32, or 64 characters per entry.

For example, Buf0[100]#a="Label #1" stores the string "Label #1" at Buf0 index 100.

Buf0[100]#a2="Longer Label #1" uses index 101 as well as 100 to hold the 15-character string. (A null is entered as the 16th character.)

Similarly, use #a4 and #a8 to specify 4-element (32-character) or 8-element (64-character) strings.

Any unused characters in an element are padded with nulls, which will be ignored when the string is used.

If an attempt is made to enter a string that is longer than the specified size, the extra characters will be ignored.

A string may include any standard ASCII character that can be typed into a macro definition, such as alphanumerics or symbols, as well as any string expression options such as n to start a new line, or t to insert the current time.

Strings may be copied from Notes, Labels, or Fields. For example, Buf0[100]#a2=Field1 will copy the contents of Field1, which may hold up to 15 characters.

Note that with string expressions you must choose the array string size specifier (#a through #a8) for the longest string expression output. For example, if you want to store the long-form channel name (such as "Left In") of the channel number previously specified via the Channel Select variable Ch, using Buf0[100]#a=Ch(c) will store only "Right Ou" if Ch = 3. Instead, use the longer Buf0[100]#a2=Ch(c)

Alternatively, you could use Buf0[100]#a=Ch(C) (note uppercase 'C') to specify short-form channel names, which are all exactly 4 characters like "R.O.".

To use array strings in a string expression, you use the same a through a8 specifiers (without the #) in place of the alphanumeric format A, as in Msg=Buf0[100](a2).

You may also read a single character from a string. For example, Buf0?5[123] will return character 5 of element [123] in Buf0. The character number after the '?' may range from 0 to 7 to read any of the 8 characters stored in the given element. One use for this is to provide different macro actions depending on a part number, test series, or subject code specified in a Field by the operator. You would first copy the Field to an array element, such as Buf0[123]#a=Field1, then test for certain characters with IF.Buf0?0[123]="A" to see if the first character in Field1 is 'A'.

A string assignment to an array element may include other string array elements, including itself. For example:

    Buf0[100]#a=Buf0[100](a) + "EFGH"

This will leave the element holding "ABCDEFGH".

Each Buf0-7 array can hold:

    1024 8-character strings
    512  16-character strings
    256  32-character strings
    128  64-character strings

An array can mix these formats in any combination, including conventional numerical values.

Arrays containing strings (plus anything else) can be saved to .BUF files using Buf0="<Save:MyFile", but not with Buf0="<SaveTXT:MyFile" or any other explicit Save format. Those will save numerical data, but not strings. (SaveTXT saves numerical data as strings, but it won't save arbitrary strings directly.)

Likewise, you can only load arrays containing strings (plus anything else) with Buf0="<Load:MyFile". The file must have a .BUF extension for this to work. If you have a .TXT file containing strings that are to be loaded as-is (not converted to numbers), then you must rename or copy it to have a .BUF extension.

Since the Buf0-7 arrays can each hold up to 1024 strings of 8 characters each, a single .BUF file can normally hold up to 8192 characters. But you can save 2 or 4 adjacent arrays as "multi-channel" files that will likewise be loaded to adjacent arrays. So in principle you could save up to 32768 characters to a single file. (See "Saving Buffers To Files" and "Loading Buffers From Files" under Macro Array File Operations.)

Whether saving or loading a file, no recognition is given to the format or organization; it's all "just bytes". You can organize and mix formats any way you choose. In particular, you can load raw continuous text (not parsed into 8, 16, 32, or 64-byte strings) and parse it as desired.

The Multiple Meters mini-app employs mixed array usage with Buf6, which holds various parameters, plus voltage, dB, and frequency values for each channel, along with strings to label custom controls and meters with the selected measurement mode (like "RMS" or "Peak-to-Peak").

For example, when started the main Multi_Meters macro loads the strings into Buf6[900]#a2 through Buf6[920]#a2 via:

    Buf6[904]#a2="Positive Peak"
    Buf6[906]#a2="Negative Peak"
    Buf6[908]#a2="Absolute Peak"
    Buf6[910]#a2="dB  Re: 1V Sine"
    Buf6[912]#a2="dB  Re: FS Sine"
    Buf6[914]#a2="Crest Factor"
    Buf6[916]#a2="Crest dB"

Later, when the user clicks Custom Controls Btn0 to select a channel for adjustment, or Btn2 to select a new measurement mode for the selected channel, the _Multi_Mtr_Ctrls macro calls _Multi_Mtr_Mode.

_Multi_Mtr_Mode sets the current channel Ch from the Btn0 value (0-3) and sets UC to the measurement mode number (0-10) for that channel which is stored in Buf6[800] to Buf6[803] via UC=Buf6[800 + Btn0]. It then sets UI as an index variable to find the proper string for that channel and measurement mode. It labels Btn2 with the measurement mode via Btn2="" + Buf6[UI](a2), and labels the meter for that channel with the channel name and the measurement mode via MtrV="<<" + Ch(c) + " - " + Buf6[UI](a2)

Ch=Btn0                        ;Set channel to Btn0 state 0-3
UC=Buf6[800 + Btn0]            ;Get meter mode for this channel
UI=900 + 2 * UC                ;Index for mode text for this chan
Btn2="" + Buf6[UI](a2)         ;Label button with mode for this chan
MtrV="<<" + Ch(c) + " - " + Buf6[UI](a2)   ;Chan and mode to Mtr title

Without the use of string arrays, this same section of _Multi_Mtr_Mode code would require 11 separate IF statements, one for each possible measurement mode:

IF.Buf6[800 + Btn0]=0
    MtrV="<<" + Ch(c) + " - RMS"
    MtrV="<<" + Ch(c) + " - Peak-to-Peak"
    Btn2="Positive Peak"
    MtrV="<<" + Ch(c) + " - Positive Peak"
    Btn2="Negative Peak"
    MtrV="<<" + Ch(c) + " - Negative Peak"
    Btn2="Absolute Peak"
    MtrV="<<" + Ch(c) + " - Absolute Peak"
    Btn2="dB  Re: 1V Sine"
    MtrV="<<" + Ch(c) + " - dB  Re: 1V Sine"
    Btn2="dB  Re: FS Sine"
    MtrV="<<" + Ch(c) + " - dB  Re: FS Sine"
    Btn2="Crest Factor"
    MtrV="<<" + Ch(c) + " - Crest Factor"
    Btn2="Crest dB"
    MtrV="<<" + Ch(c) + " - Crest dB"
    MtrV="<<" + Ch(c) + " Frequency"
    MtrV="<<" + Ch(c) + " - Off"

See also Macro Overview, Macro Arrays Buf0-Buf7


Questions? Comments? Contact us!

We respond to ALL inquiries, typically within 24 hrs.
Over 30 Years of Innovative Instrumentation
© Copyright 2007 - 2017 by Interstellar Research
All rights reserved