Background Method

Some objects may require CPU intensive tasks that do not need to execute immediately. For this purpose xAF offers the background process. To enable this functionality the object will override backgroundMethod and hasBackgroundMethod. hasBackgroundMethod needs to return true. Within the method, the object can do whatever it wants. This method will be interrupted by other threads; even the object’s calc method. For this reason, the logic in this method must be implemented in a protective, thread-safe manner.

virtual void CAudioObject::backgroundMethod () {};
virtual bool CAudioObject::hasBackgroundMethod () const
{
    return FALSE;
}

Audio Object Configuration

Before any audio flow design can start, the design tool needs to know about the audio objects and how to interact with them. All objects must provide the information in the structures below, and expose them to the tool through dll calls. This dll is generated by the Visual Studio solution, VirtualAmp.

This code will not be compiled in embedded libraries. It will only be compiled in the toolbox library targeted for GTT.

Audio Object Memory

 

API

The below API is used to fill memory records according to given target and data format:

xUInt8 getMemRecords(xAF_memRec* memTable, xAF_memRec& scratchRecord, xInt8 target, xInt8 format);
  • getMemRecords() is called by the GTT when it needs to know how many memory records each object contains or requires and their type, latency and size which depends on target and data format.
  • The memory record sizes could be dependent on these object variables: m_NumElements, m_NumAudioIn, m_NumAudioOut, BlockLength, SampleRate, additional configuration data, etc

By default, the getMemRecords() method will return zero number of records and doesn’t fill the provided memTable if your object does not require any dynamic memory, you do not need to override these this method.

Memory Configuration on GTT

In the SFD when AudioObject is drag into panel, GTT will call getMemRecords() API to collect memory records details from the object to update the memory latency table. This will be repeated for all the AO’s of the SFD. Once the design is complete it shall be saved.

The user can open the memory latency editor and edit the latency levels. After saving the latency levels, if the object properties were edited and saved, the user will loose the saved latency levels for that object because GTT will call getMemRecords() again that will reset to default latency levels.

Graphical user interface, text, application Description automatically generated

Scratch memory does not need to be allocated for each audio object since all the audio objects can use the same scratch memory. The GTT  calculates the maximum scratch memory, maximum alignment and minimum latency requested by the audio objects, and put it into AudioProcessing chunk.

The elements of this table must be of the data type xAF_MemRec, which is shown below:

Member Description
alignment This is the required alignment for the memory region.
memType Type of the memory to be allocated – memType could be:

  • COEFFCIENT_MEM – This memory is used to store both tuning parameters and variables / buffers for internal usage by the audio objects.
  • SCRATCH_MEM – This memory is only used for temporary calculations.
size This is the size of the memory to be allocated.
memLatency This can take values from one to five where one – low latency and five – high latency.

While sending the signal flow to the target device the memory records details will be send as part of audio processing chunk and audio object chunk in the signal flow write command.

Memory allocation in framework

The memory records are part of flash file so the platform needs to parse the flash file using DSFD parser that would give audio processing properties and audio object properties structures.

The platform needs to register the platform dependent memory allocator and deallocator in the constructor CAudioProcessing::CAudioProcessing().

Now call the CAudioProcessing::initFramework() pass the audio processing and audio properties structures, which will allocate the requested memory using platform dependent allocator and calls CAudioObject::setRecordPointers() (it will set m_MemRecPtrs) and CAudioObject::init() API’s for every objects.

Audio Object Memory Declaration and Usage

There are two types of memory used when allocating memory for audio objects.

  • Scratch Memory: Scratch memory is non persistent memory that is used by an audio object only during an audio interrupt. Data in the scratch memory is not guaranteed to remain unchanged from one audio interrupt to the next. Up to and including Deep Purple, each object is restricted to one memory record. Developers can determine the size, alignment and latency level required.
  • Coefficient Memory: Coefficient memory is any other type of persistent memory that is required by the audio object. There is no limit to the number of records developers can create. Developers can configure the size, alignment and latency levels required for each record and they can be different for every record.

Audio Buffers: The audio buffers provided in the calc function are intended to be read and write only, i.e. they should not be used for intermediate calculations. If intermediate buffers are required, scratch memory must be requested. The reason for this is that it is not guaranteed that the buffer per channel will be unique for unconnected pins. For unconnected pins on the input side, xAF provides a single buffer (filled with zeros) that is shared by all audio objects in an xAF instance. It is expensive (MIPS-wise) to clear this buffer each time, so it is important not to write data to this buffer and leave it untouched, as it will be read by all audio objects with unconnected pins. For unconnected output pins, xAF allocates a single “dummy” buffer for all unconnected pins, rather than a unique buffer per channel.
For audio objects that support in-place processing and all pins are connected, xAF will assign the same input and output buffer per channel, but if there are unconnected pins, the input and output buffers will be different, so the audio object developer should not blindly rely on the input and output buffers being the same or different. It is highly recommended to implement proper checks if the algorithm requires any of the above input/output buffer constellations.

Purpose of this Document

This guide is intended to help developers in creating audio objects in the Extended Audio Framework (xAF). The framework act as a gateway between the audio object and the outside world.

This guide covers the following topics:

  • An overview on how audio objects interact with the framework, including the order in which the framework interacts with the audio object.
  • Details on the audio object configuration in the design tool and how to set it up.
  • Basic Features and APIs
  • Advanced features and APIs.
  • An example of a template audio object, which will include a reference implementation for all of the items mentioned above.
  • An explanation of how to connect external audio objects to the framework.
  • Information on the general guidelines that xAF objects should follow.

Terms and Abbreviations

Terms

  • Global Tuning Tool (GTT): Global tuning tool is used to configure the audio algorithm framework seamlessly and intuitively, as well as to tune algorithm.
  • Run-Time: When a signal flow is deployed and running on a target device.
  • Design time: Design-time is referred when a signal flow is being designed in the GTT signal flow designer. At that point nothing is running on a target device.
  • Tuning variables/Tuning parameters: These are the variables within audio objects that are modifiable through a set/parameter file change. These variables are also modifiable from GTT at runtime. For example, a channel gain value within a gain object that can be modified during a set file change is considered a tuning variable.
  • State variables / State tuning parameters: These are the variables within audio objects that are modifiable at runtime from GTT or from other embedded code. These variables are not saved in a set / parameter file. For example, a channel volume value within a volume object that can be modified during runtime is considered a state variable.
  • Metadata: Metadata is data provided by the object developer to GTT at design time. This data is not used at runtime. It is usually provided in the object toolbox file which is compiled only for GTT. Examples of metadata the object will send GTT are:
    • Description of the object control inputs and outputs
    • What processors the object is supported on
    • What block sizes and sample rates the object can operate at

Abbreviations

xAF: Extendable Audio Framework BAO: Basic Audio Object
GTT: Global Tuning Tool SR: Sample Rate
SFD: Signal Flow Designer BL: Block Length
xTP: Extendable Tuning Protocol VST: Virtual Studio Technology
HU: Head Unit AWX: AudioworX

Requirements

This is the document that audio object developers should use as reference when creating audio objects for the xAF framework.

Req. ID Req. Name Description Comment
CASCCGAF-210 Developers guide to create object for xAF document

Audio Object Workflow

Design Time Work flow

The work flow during design time is described below. Design time is when the user is creating a signal flow from the Signal Flow Design tool within GTT. These are the interactions that go on between the tool and dll loaded into the tool:

Runtime Workflow

The workflow during runtime between the framework class, CAudioProcessing, and the audio objects base class, CAudioObject, is described below.

Waterfall Chart

The Waterfall Graph is a visual representation used to analyze and interpret the frequency content of a WAV file or any other signal data. This graphical representation provides a comprehensive view of the signal frequency distribution over time, allowing to identify patterns, anomalies, and trends that may not be evident in a traditional time-domain or frequency-domain plot.

You can easily identify dominant frequencies, harmonics, and noise within the signal. The intensity and color of each frequency component indicate its amplitude and presence within the signal, respectively.

On the Central Viewer window, you can switch to 3D view of the plot. On the 3D view, you can see the waterfall chart.

Import Recorded File: Click “Import Recorded File” to import .wav audio files directly onto the chart.

Customize Calibration Data: You can adjust the calibration offset, measurement unit, and enable/disable flags for the recorded files. On entering the calibration details, corresponding values will be applied to the chart.

Chart Details:

  • Axis Details: X axis represents the frequency, Y axis represents the amplitude, and Z axis represents time.
  • Calibration offset is displayed at the bottom for reference.
  • A legend represents the energy levels of the graph.
  • Customization Options: Apply different Window and Display options to customize the graph appearance.
  • Zoom and Rotate: Explore the data in detail with mouse scroll, pinch-to-zoom, and 360-degree rotation capabilities.
  • Slice Control: Choose the number of slices (10-100) to segment the graph for analysis.
  • The selected .wav file and settings are saved and retrieved within the project.

IR measurement plot:

It is possible to view IR measurement also in 3D view. Any mic and speaker selection plot will be displayed in waterfall plot.

At any point of time only one signal can be viewed. Multiple mode is not applicable for 3D plot.

Settings:

It is possible to change the X and Y axes range of the graph. “Fit To Data” will consider the min and max values of X and Y range. However, there is a known limitation of cropping in while using the settings.

Limitations:

  • It is not possible to view both IR and imported file plot at same time. Graph always shows latest selected option.
  • It is not possible to delete or clear the plot. Workaround is to import new file again.
  • dBFS unit is by default. Since it is not possible to add calibration with this unit, this unit will be removed in future.

Known behavior:

There are a couple of specific behaviors in the 3D view that deviate from expectations. These require a fix from the third-party.

  • If scale is changed, graph is not clipped.
  • Mouse hover is not exactly pointing to peak.

Curve Lists

Every curve displayed in a graph is referenced by an entry in either the browsing or the permanent curve list.
A curve list entry consists of following components:

  • Parent configuration of the curve.
  • Speaker name of the curve.
  • Microphone name of the curve.
  • Color of the curve.
  • Checkbox for show or hide the curve.

You can change the following curve properties of an entry:

  • Change the name.
  • Change curve thickness.
  • Change offset.
  • Change the color.
  • Attach curve to secondary axis (right axis).
  • Add comment for trace. The provided comment will be exported and imported along with curve.
  • Shows the associated math operation (in the case of math curves).

Double-click on the entry to open curve properties dialog box, perform the respective change, and click ok.

The curve name is not editable if the average is calculated with a cross-mic array.

Browsing List

The browsing list holds entries for all curves that are directly linked to elements currently selected on the scene.

The curves will immediately disappear once the respective elements on the scene are de-selected. It still remain in the same order if GTT re-open.

The browsing list toolbar offers the following options.

Name Icon Description
Recolor All Curves The recolor button assigns easily distinguishable colors to all curves present on the graph.
To permanent list Sends the highlighted curve from the browsing list to the permanent list, detaching it from the scene selection
Move Curve Up To move the highlighted curve up in the list.
Move Curve Down To move the highlighted curve down in the list.
Export Curve Using the export option you can send two type of data.

  • Frequency domain data
  • Time domain data

Based on the selection, GTT will export the trace data (frequency-magnitude-phase or time-amplitude) into a text file.

More Options (…)

Re-Measure Step: Once completing the initial measurements and conducting a thorough analysis of the acquired data in the Central Viewer, it may be identified that re-acquisition is necessary for certain speakers due to changes in hardware setup or tuning data.

In such cases, GTT provides an option to re-acquire specific steps, allowing for the overwrite or appending of new measurements to the existing session.

To utilize this feature:

  1. Analyzing the acquired data in the Central Viewer, determine if there are any discrepancies or changes that require re-acquisition.
  2. On the Browsing Chart Curves view, navigate to the more option (…) button and click on Re-Measure Step.
    This will initiate the process for re-acquiring specific steps of the measurement.
  3. In the Measurement acquisition view, select the option to overwrite the current measurement or append to the session and then execute re-acquisition for the selected step.
  4. Once the re-acquisition process is complete, review the results in the Central Viewer to ensure that the desired changes have been captured accurately (all configurations modified are going to be re added to have a clean import).

The Re-Measure Step feature provides flexibility and precision in managing measurement data, enabling to adapt to changes in hardware setup or tuning data effectively.

The Re-Measure step is possible only if one Mic array is selected on car view.

Set as Original Instance: When we perform a re-measure with the append option, multiple measurements can be available for a single speaker. In this case, the user can select a particular measurement instance (browsing curve) and mark it as the ‘Original instance.’ This means that when averaging mics across the mic array, only the mic array instances marked as original will be considered.

This option is available other than ‘Average’ Mic selection mode.

Permanent List

The permanent list holds curves that are manually sent from the browsing list and the results of math operations. Curves in this list are detached from the scene selection and kept in the same order, until they are manually deleted.

The permanent list toolbar offers the following options.

Name Icon Description
Math Opens the math operations dialog. Any math result will be stored in the permanent list
Recolor All Curves The recolor button assigns easily distinguishable colors to all curves present on the graph.
Move Curve Up To move the highlighted curve up in the list.
Move Curve Down To move the highlighted curve down in the list.
Move Curve Down Remove highlighted curve from the permanent list
Export Curve Using the export option you can send two type of data.

  • Frequency domain data
  • Time domain data

Based on the selection, GTT will export the trace data (frequency-magnitude-phase or time-amplitude) into a text file.

Import Curve Using the import option you can import following type of data.

  • HATS files data (frequency-magnitude-phase)
  • OVL files data
  • RTA frequency files.

This feature facilitates you preform following comparison:

  • Compare legacy measurements conducted using HATS software with GTT measurements.
  • Compare imported files from RTA or exported from Central Viewer.

Additionally, using the imported files you can perform math operations and adjust graph settings such as smoothing.

Math Operations

The math operation allows you to performing calculations on your curves. Clicking on the “Math” button opens a Mathematical Operation dialog box with various tabs, each offering a specific mathematical function.

The following math functions you can perform.

  • Add: To add two or more signals.
  • Subtract: To subtract of two signals.
  • Multiply: To multiply frequency domain of two signals.
  • Spectral Division: To divide frequency domain of two signals (to calculate frequency difference).
  • Average: To calculate average frequency domain for magnitude and phase.

To illustrate combining curves, let’s explore the steps involved using the Add tab.

  1. On the Add tab, select Operand 1 and Operand 2 curve.
    If required, add or delete an operand using + and – option.
  2. Enter the Resulting Chart Series Name and select the color.
  3. Click Ok . The result of the curve added to the active chart.

Graph Area

The graph area displays the graphically quantitative data corresponding to the selected configuration. The displayed graph is controlled by a chart selector, for more details, refer to the Chart Selector.

Every chart can hold up to 2 sub-plots. Every sub-plot has its own zoom-bars for the x- and y-axis.

The following options are available for configuration on the Graph.

Shortcut keys to perform the following action on the chart.

CTRL + Left-click drag To zoom into the marked area.
Mouse wheel To control the zoom level on the X-axis.
CTRL + Mouse wheel To scroll the chart on the Y-axis.
Right Mouse drag To move the chart to the Y-axis.
ALT + Mouse wheel  To control chart dragging in the X-axis.
SHIFT + Mouse wheel To control chart dragging in the X-axis.
Double-click To zoom chart predefined limits in two steps (first X, then Y axis)

 Zoom and Scroll Controls

The following controls can be used to perform zoom and scroll functions on the graph.

Alt + MW (Zoom on Y axis) Expand the Y-axis to zoom in or out of the values on the graph.
Ctrl + MW (Zoom on X axis) Expand the Y-axis to zoom in or out of the values on the graph.
Shift + MW (Scroll on X axis) Scroll the visible graph along the X axis up to the visible or configured limits, that is, if the graph shows the maximum visible value in the configured X, the scroll will not be available.
MW (Scroll on X axis) Scroll the visible graph along the Y axis up to the visible or configured limits, that is, if the graph shows the maximum visible value in the configured Y, the scroll will not be available.

MW=Mouse Wheel 

Moving the cursor over the plot will generate a crosshair that indicates values in the X and Y axes. The crosshair will always follow the line closest to the mouse cursor. On the axis, the corresponding values will be drawn.

Below is an example of a chart with a crosshair on top:

Data can either be displayed in the time (ms) domain or the frequency (Hz) domain. Using the display selector you can choose the domain for any selected chart. For more details refer to the Domain Selector.

Window

Windowing in FFT (Fast Fourier Transform) is a technique used to reduce spectral leakage and improve the accuracy of frequency analysis. This involves multiplying the time-domain signal by a window function before applying the FFT. Common window functions include the Hamming, Hanning, and Blackman windows, etc.

Windowing reduces the abrupt edges of the signal, which helps to minimize distortion in the frequency domain, especially when analyzing non-periodic signals. Keep in mind that windowing introduces a trade-off between main lobe width and sidelobe levels in the frequency domain.

A Windowing option is placed on top of every graph (Time, Magnitude, and Phase graphs). This sets the display options for the respective graph. Currently available options are:

  • Hann: The Hann window can be seen as one period of a cosine “raised” so that its negative peaks just touch zero (hence the alternate name “raised cosine”).
  • Rectangular: The rectangular window is the simplest window, equivalent to replacing all but N consecutive values of a data sequence by zeros, making it appear as though the waveform suddenly turns on and off.

Weighting

The Weighting function allows you to select how to visualize the graph using the specific weighting.

For more details about weighting, refer to the A-weighting.

FFT Length

The FFT Length parameter determines the number of data points used for performing the Fast Fourier Transform (FFT). It directly affects the frequency resolution and the time required to compute the FFT.  You can select from the following FFT length options:

FFT length selection balances frequency resolution and processing speed, with shorter lengths providing faster analysis and longer lengths offering higher resolution. Use the Full Signal option for a detailed analysis of the entire length of the signal.

FFT length impacts phase accuracy by providing finer phase resolution with longer lengths, while shorter lengths may cause phase wrapping or reduced precision, especially at lower frequencies.

Theme

There is a Toggle button (dark/light theme) in the charts in Central Viewer. Once the Toggle button is clicked, the corresponding custom theme can be selected, and the background of the graph gets changed and vice versa.

Dark Theme

Light Therme Theme

Chart Configuration

You can configure the axis on the chart configuration window. Click on the gear icon on the top left corner of the graph.

In the chart configuration window, you can set the minimum and maximum range of the X and Y axes. The auto-scale option allows the chart to determine the axis range based on the data.  Additionally, the graph zooming out and resetting will be restricted to the axis range defined in minimum and maximum values.

On the chart configuration window, you can customize the Y-axis gridlines. There are two types of markings on a Y-axis; a minor mark indicated just by small lines on the plot, and a major mark, where values are also added.

  • Label Distance: To change the distance between the markings with values.
  • Grid Distance:  To change the distance between minor marks is indicated by small lines.

You can also keep these distance values blank, which will allow the chart to calculate itself based on the data and zoom level.

Export to Image

The Export Image feature allows you to export the graphs and certain other details based on the export setting configuration. The exported image file will be available in .png or .jpeg format.
Once you click on the “Export to Image” option, the export setting window for the image will open.
This export setting window includes the following options:

  • Title: Enter the image name.
  • Image Width: Change the image width.
  • Image Height: Change the image height.
  • Include Data: Select the option to add a Timestamp and Legend in the image.
  • Comments: Enter the specific comment, that you want to be added in the image.
  • Logo: Add the desired logo to the image.

Once you configured export settings, click the Export button. The context menu will show you two options, export the image or copy to the clipboard.

  • Save image as – option will be opened to save the image to a file.
  • Copy the image to the clipboard – will allow you to paste the graph image somewhere else.

The exported image will have the following sections based on the export setting window configuration.

The graph is always present in the exported image. Based on the export setting configuration additional sections like – Measurement information, Title, Time, User details, Logo provided, Live channel data, and Generator instance details are also present in the exported image.

Zoom To Gates

The Zoom To Gates feature allows you to zoom to a specific area in the chart using four gates (two horizontal and two vertical) which you can position by selecting and dragging them to the desired position or if you prefer by placing the value of the position in the chart in the text boxes.

By default, when there are no Curves in chart the values from gates are the limit of visible range of current chart. Only for old projects with that has a loaded curve, the gates will set on the limit of visible range included data.

The Gates is supported for Time, Magnitude and Phase charts.

When you move each gate, the current position will be reflected in each value referred to the bottom of the chart identified with a color.

To zoom in on the area between the four lines: Click on the button at the end of the text boxes with the current position values ​​of the gates “Done” and the chart area will automatically position the gates within the limits of the chart and the zoom to the area will have been performed.

To return to the default value you only have to double click on any area of ​​the chart.

All gate values ​​will be persistent across projects, meaning you can save their last configuration to be exported or used later with specific values.

Scene View

Once a configuration has been added to the list, the measurement setup used during that measurement session will be displayed in the scene view. The elements on the scene can be clicked and serve as data selectors. The combined selection of a microphone and a loudspeaker displays the respective measurement result between those two elements in the graph area.

Microphone and speaker elements are displayed as follows:

The behavior of the element selection on the scene view is controlled by the selection mode toolbar above. The following selection modes are available:

  • Single: Only one element of this type of Individual microphone must be selected by clicking on the single microphone icon (red elements in the images above). Automatically unselects previously selected element(s). Assuming both are in single selection mode only one curve is displayed at any given time.
  • Multiple: Several elements of one type can be selected across Individual channels of a microphone and can be selected/deselected by clicking on the single microphone icons (red in the images above). The entire array can quickly be selected/deselected by clicking on the white frame of the microphone icon. Assuming both are in multiple selection mode, [number of selected speakers] x [number of selected microphones] curves are displayed at any given time.
  • Average: Only available for microphones. Selecting several individual microphones or entire arrays automatically computes the magnitude average over their measurement results. This mode results in the display of [number of selected speakers] curves at any given time.
  • Locked: No selection can be changed to prevent unintentional.

Configuration List

The Configurations section is containers for one instance of a measurement sequence of a session done with the GTT Measurement Module. The container principle enables the user to load the same measurement session several times, enabling the comparison of different source-receiver combinations and processing options.

The Configurations comprise of following options:

  • Add Configuration: To add the loaded configuration list.
  • Move Up: To move the configuration up in the configuration list.
  • Move Down: To move the configuration down in the configuration list.
  • Delete Configuration: To delete the configuration list.
  • Session Management: The session management window offers a simple interface for the import, export, and deletion of sessions and sequences. For more details refer to Session Management.

Add Configuration

The (+) button of the configuration toolbar opens the “Add Configuration” dialog. On the Add Configuration dialog box, you can select the session and a measurement sequence within this session. The configuration can also be named individually in this dialog.
Also, there is the option to select the proper signal options (IR / Recorded) and calibration enabled checkbox as per the selected measurement session.

Rename and Reassign: Double-click a configuration in the list to open the Add Configuration dialog, where you can rename and reassign it.

Configurations containing incomplete data (e.g., measurement sessions that have been finalized before all steps were executed) are identified. A list of missing measurements will be displayed while hovering over the respective entry in the configuration list.

Configuration Settings

  • Signal Type: Central Viewer is capable of displaying IR or Recording data. While creating the configuration, the signal type can be chosen.
  • Calibrated Data: Central Viewer is also capable of displaying uncalibrated and calibrated data (or a mix of both). Calibration can be enabled or disabled in the Add/ Edit configuration window.

  • If “Calibration Enabled” is not selected, all data will be shown without applying any calibration offset (regardless of whether calibration data is available in the Session or not).
  • If “Calibration Enabled” is selected, a Y-axis with calibrated ranges will be available on the right side of the plot. Each series containing calibration shall be attached to the calibrated Y axis, and each series with no calibration data available will be attached to the default Y axis (uncalibrated, on the left).

Example: Calibrated and uncalibrated data shown on the same axis (calibration disabled).

Example: Calibrated data is attached to the axis on the right, while uncalibrated data is attached to the axis on the left (calibration enabled).

Apply Compensation: If a compensation file is selected in the Measurement Acquisition process and based on the checked state of “Apply Compensation” in the Add Configuration view, the mic compensation data will be used for magnitude curve correction.

Session Management

The session management window offers a simple interface for importing, exporting, and deleting sessions and sequences. To edit session and sequence names, simply double-click on the respective name, and the editing interface will appear. Once you have edited the names, the changes will persist and be saved.

The session management for Measurement Module Sessions is available through a button in the Central Viewer.

The toolbar offers the following functions:

Icons Description
Import *.mmraw data
Export a session or sequence either as *.mmraw or as JSON
Delete selected session or sequence

 

If you need to modify the session note click on the Edit Button to access edit mode.

The JSON export functionality offers all the functionality that has been available in the legacy measurement module.

The user can assign any seat position for the mic array in the Microphone Config view. In the exported json file, based on the selected seat position, the exported mic array format should follow the same convention as the rotating and non-rotating mic arrays, i.e., {Mic Array Name}_{PositionName}.

For example, if the mic array name is “6 Pos Mic_1” and the selected position is “Row 1 Left”, the exported format should be:
“6 Pos Mic_1_Row 1 Left”.