Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Scroll Documents: Update page title prefix

This page walks through a complete example of an audio module, starting from the high-level MATLAB model and continuing through the generated code. This example is identical to the scaler_smoothed_module.m contained in the Deprecated module library. We go through this module in a systematic fashion and reference the source files listed in Scaler Smoothed Example Source Files. Examples Module Library contains additional module examples which highlight advanced features.

...

The directory contains several subdirectories. This directory structure must be followed when creating other custom audio module libraries. In order to build the examples modules, the above path must be on the Audio Weaver module path variable, which can be retrieved in MATLAB with the ‘add_module_path’ command. The correct path should already be included in a normal installation of Designer, but if it is not, or if another path needs to be added, the module path can be updated using the ‘add_module_path’ command or with the File > Set Module Path menu in Designer.

Module M-files
Anchor
ModuleM-files
ModuleM-files

Each audio module has an associated module M-file, item 1 shown in Figure 1. For this example, the file is found in

...

All of these items above are documented in the Audio Weaver Matlab API. The specific items in the module m-file pertaining to module generation are variables, code markers, and wiring allocation guidelines described in Generating Module Libraries (in particular, the sections Specifying Wiring Constraints and Code Markers and Template Substitution).

Subsystems are very similar to modules, but also contain a list of internal modules and a list of connections between modules.

Audio Module Instance Structure
Anchor
AudioModuleInstanceStructure
AudioModuleInstanceStructure

Every audio module has an associated instance data structure that holds the variables – state and parameters – needed by the module. In this example, there are 4 variables described in the module m-file:

...

Note: Many of the items are surrounded by #ifdef / #endif pairs. This allows various features of the modules to be enabled or disabled at compile time.

Audio Module Source Code (.c and .h files)

Each audio module has a set of associated functions. These functions, and their definitions, are placed in .c and .h files, respectively. At a minimum, every audio module requires a processing function. In addition, a module may specify several optional functions:

...

The classID for the ScalerSmoothedExample module equals the IDOFFSET (32768) plus the value listed next to its class name below (0). Class IDs starting with 32768 are reserved for custom audio modules.

Audio Module Schema File

The generated schema file ExamplesSchema.sch provides a "blueprint" of all of the available objects on the target processor to the Server. This enables the Audio Weaver Server to instantiate and manipulate objects by name rather than hexadecimal IDs or offsets. The schema file for each module pack is embedded in the module DLL and is shown as item 9 in Figure 1. It contains definitions for all of the available audio modules in the module pack.

...

The schema file also lists the module's instance variables and is used to compute offsets from the start of an object. When the value "Scale1.gain" is set during tuning, the Server translates this to a specific address on the DSP (PC) using the "Scale1" object address as a base, and then adding an appropriate offset. In this case, the offset equals 8, the size of BaseModule.

Generating Module Code

The MATLAB file scaler_smoothed_example_module.m has a complete description of the audio module with sufficient information to generate all of the source files and documentation. You can generate the source files for a smoothly varying scaler using the commands:

...

You'll note that all source files are marked as "Unchanged". Audio Weaver only overwrites generated files if there has been an actual change. This minimizes file changes and makes it easier to work with source code control systems.

Template Substitution

Audio Weaver uses template substitution to generate audio module source and header files. The template files are shown as item 2 in https://dspconcepts.atlassian.net/wiki/spaces/DOCHUB/pages/2748822128/Module+Development+Overview#OverallEnvironment and two files are used:

  • <AWE>\matlab\module_generation\templates\awe_module_template.c

  • <AWE>\matlab\module_generation\templates\awe_module_template.h

...

shown in InnerScalerSmoothedExample_Process.c. You'll note that this is bare code missing even the function definition (which is in the template file). The other code markers – "preProcessFunction" and "postProcessFunction" are not defined. After template substitution, we end up with the final processing function ModScalerSmoothedExample.c shown in ModScalerSmoothedExample.c.

Building the Audio Module DLL

At this point, the source code for all of the modules in the Examples library has been generated. Open up and rebuild the Visual Studio solution file <AWE>\AWEModules\Source\Examples\Examples.sln.

with the build configuration set to x86 Release. The solution builds the DLL and then copies it into the directory <AWE>\Bin\win32-vc142-rel so that it can be referenced by the Server. Further details on this step can be found in https://dspconcepts.atlassian.net/wiki/spaces/DOCHUB/pages/2748822407/Building+Audio+Module+DLLs#BuildingExamplesDLL.dll.

Summary of Steps Involved in Writing an Audio Module

To summarize, the steps required in writing a new audio module are:

  1. Create the MATLAB module m-file described in Module M-files. It defines:

    1. Input and output pins

    2. Instance structure variables

    3. Links to inner C code.

    4. Documentation

    5. User interface

    6. Module browser for AWE Designer

  2. Write the inner C code for the processing function.

  3. Write the inner C code for the other module functions, Constructor(), Set(), Get(), and Bypass(), if needed.

  4. Pick a unique integer ID (any number in the range 32768 to 63487) for the new module class ID. Add this information to the file classids.csv associated with the module library.

  5. Add the module function to the specific module pack library generation script, for example make_examples.m. Run the script file to generate the source code and create the schema file.

  6. Add the generated .c and .h files to the project for building the audio module pack library (e.g., ExamplesLib.vcproj) and build the library.

  7. Build the audio module DLL so that the new modules are visible by the Server.

Scaler Smoothed Example Source Files
Anchor
ScalerSmoothedExampleSourceFiles
ScalerSmoothedExampleSourceFiles

The following sections feature expandable code blocks with the contents of example source files.

scaler_smoothed_example_module.m
Anchor
scaler_smoothed_example_module.m
scaler_smoothed_example_module.m

Expand
titleClick to expand "scaler_smoothed_example_module.m" example source
Code Block
function M=scaler_smoothed_example_module(NAME)
% M=scaler_smoothed_example_module(NAME)
% Creates a smoothly varying scaler module with a single input
% and single output pin.  This module operates on floating-point
% signals.  Arguments:
%    NAME - name of the module.

% Copyright 2007-2016.  DSP Concepts, Inc.  All Rights Reserved.

% ----------------------------------------------------------------------
% Create the high-level object with interface variables only.
% ----------------------------------------------------------------------

M=awe_module('ScalerSmoothedExample', 'Linear multichannel smoothly varying scaler');

% Version is auto-updated by SVN:
M.moduleVersion = generate_version('$Revision: 30333 $');
if (nargin == 0)
    return;
end
M.name=NAME;
M.preBuildFunc=@scaler_smoothed_example_prebuild;
M.processFunc=@scaler_smoothed_example_process;
M.setFunc=@scaler_smoothed_example_set;

PT=new_pin_type;

add_pin(M, 'input', 'in', 'audio input', PT);
add_pin(M, 'output', 'out', 'audio output', PT);

add_variable(M, 'gain', 'float', 0, 'parameter', 'Target gain');
M.gain.range=[-10 10];
M.gain.units='linear';

add_variable(M, 'smoothingTime', 'float', 10, 'parameter', 'Time constant of the smoothing process');
M.smoothingTime.range=[0 1000];
M.smoothingTime.units='msec';

add_variable(M, 'currentGain', 'float', M.gain, 'state', 'Instantaneous gain applied by the module.  This is also the starting gain of the module.', 1);
M.currentGain.range=M.gain.range;
M.currentGain.units='linear';

add_variable(M, 'smoothingCoeff', 'float', NaN, 'derived', 'Smoothing coefficient', 1);

awe_addcodemarker(M, 'processFunction', 'Insert:InnerScalerSmoothedExample_Process.c');
awe_addcodemarker(M, 'setFunction', 'Insert:InnerScalerSmoothedExample_Set.c');
awe_addcodemarker(M, 'srcFileInclude', '#include "FilterDesign.h"');
M.wireAllocation='across';

% ----------------------------------------------------------------------
% Documentation
% ----------------------------------------------------------------------

M.docInfo.discussion={'Scales all input channels by a single gain value. ', ...
    'Changes to the gain parameter are exponentially smoothed (first order IIR) at the sample rate, with the time constant determined by the smoothingTime parameter. ', ...
    'This module is controlled by varying the gain variable.  Internally, currentGain represents the instantaneous smoothed gain that is applied. ', ...
    'currentGain exponentially approaches gain with a time constant equal to smoothingTime. ', ...
    '', ...
    'The module''s prebuild function initializes the currentGain equal to the gain.  Thus, the module begins in a converged state.'};

% ----------------------------------------------------------------------
% Add the inspector information
% ----------------------------------------------------------------------

M.guiInfo.isExpanded=0;

M.gain.guiInfo.controlType='slider';
add_control(M, '.gain');

add_control(M, '.moduleStatus', 'right', 1);
add_control(M, '.smoothingTime', 'below', 1);

% ----------------------------------------------------------------------
% Module browser information
% ----------------------------------------------------------------------

M.moduleBrowser.path = 'Examples';
M.moduleBrowser.image = '../images/ExamplesIcon.bmp';
M.moduleBrowser.searchTags = 'scaler volume';
M.shapeInfo.basicShape = 'triangle';
M.shapeInfo.legend = ' ';

return;

% ----------------------------------------------------------------------
% Prebuild function.  Behavior is based on the data type of the
% input pin
% ----------------------------------------------------------------------

function M=scaler_smoothed_example_prebuild(M)

M.currentGain=M.gain;
M.currentGain.range=M.gain.range;

% Propagate the type of the input pin to the output
M.outputPin{1}.type=M.inputPin{1}.type;

return;

% ----------------------------------------------------------------------
% Set function.  Computes the smoothing coefficient
% ----------------------------------------------------------------------

function M=scaler_smoothed_example_set(M)

% Compute the smoothing coefficient based on the smoothing time
SR=M.inputPin{1}.type.sampleRate;
M.smoothingCoeff = design_smoother(M.smoothingTime, SR, 1);

return;

InnerScalerSmoothedExample_Process.c
Anchor
InnerScalerSmoothedExample_Process.c
InnerScalerSmoothedExample_Process.c

Expand
titleClick to expand "InnerScalerSmoothedExample_Process.c" example source
Code Block
awe_modScalerSmoothedExampleInstance *S = (awe_modScalerSmoothedExampleInstance *)pInstance;
WireInstance **pWires = ClassModule_GetWires(S);
FLOAT32 targetGain = S->gain;
FLOAT32 smoothingCoeff = S->smoothingCoeff;
FLOAT32 *src = (FLOAT32 *)pWires[0]->buffer;
FLOAT32 *dst = (FLOAT32 *)pWires[1]->buffer;
UINT32 channels = ClassWire_GetChannelCount(pWires[0]);
UINT32 blockSize = ClassWire_GetBlockSize(pWires[0]);
FLOAT32 currentGain;
UINT32 i;
FLOAT32 *inPtr;
FLOAT32 *outPtr;
FLOAT32 oneMinusRate = 1.0f - smoothingCoeff;
INT32 sample;

for (i = 0; i < channels; i++)
{
    /* The same currentGain is used for each channel. Then we store the result
       from the final channel back into the state. */
    currentGain = S->currentGain;
    
    /*awe_vecScaleSmooth(src + i, channels, dst + i, channels, &currentGain, targetGain,
              smoothingCoeff, blockSize);*/
              
    inPtr = src + i;
    outPtr = dst + i;
    
    for(sample = 0; sample < (INT32)blockSize; sample++)
    {
        currentGain = currentGain * oneMinusRate + targetGain * smoothingCoeff;
        
        *outPtr = *inPtr * currentGain;
        
        inPtr += channels;
        outPtr += channels;
    }
}

S->currentGain = currentGain;

InnerScalerSmoothedExample_Set.c

Expand
titleClick to expand "InnerScalerSmoothedExample_Set.c" example source
Code Block
awe_modScalerSmoothedExampleInstance *S = (awe_modScalerSmoothedExampleInstance *) pInstance;
WireInstance **pWires = ClassModule_GetWires(S);
FLOAT32 SR;

if (mask & MASK_ScalerSmoothedExample_smoothingTime)
{
    SR = (float) ClassWire_GetSampleRate(pWires[0]);

    S->smoothingCoeff = design_smoother(S->smoothingTime, SR, 1);
}

return(0);

ModScalerSmoothedExample.h

Expand
titleClick to expand "ModScalerSmoothedExample.h" example source
Code Block
/****************************************************************************
*
*               Audio Framework
*               ---------------
*
****************************************************************************
*     ModScalerSmoothedExample.h
****************************************************************************
*
*     Description:  Linear multichannel smoothly varying scaler
*
*     Copyright:    2019 DSP Concepts, Inc. All rights reserved.
*                   3235 Kifer Road
*                   Santa Clara, CA 95054
*
***************************************************************************/

/**
 * @addtogroup Modules
 * @{
 */

/**
 * @file
 * @brief Linear multichannel smoothly varying scaler
 */

#ifndef _MOD_SCALERSMOOTHEDEXAMPLE_H
#define _MOD_SCALERSMOOTHEDEXAMPLE_H

#include "ModCommon.h"
#include "MathHelper.h"

#define MASK_ScalerSmoothedExample_gain 0x00000100
#define MASK_ScalerSmoothedExample_smoothingTime 0x00000200
#define MASK_ScalerSmoothedExample_currentGain 0x00000400
#define MASK_ScalerSmoothedExample_smoothingCoeff 0x00000800
#define OFFSET_ScalerSmoothedExample_gain 0x00000008
#define OFFSET_ScalerSmoothedExample_smoothingTime 0x00000009
#define OFFSET_ScalerSmoothedExample_currentGain 0x0000000A
#define OFFSET_ScalerSmoothedExample_smoothingCoeff 0x0000000B

#define CLASSID_SCALERSMOOTHEDEXAMPLE (CLASS_ID_MODBASE + 32768)

#ifdef __cplusplus
extern "C" {
#endif

// ----------------------------------------------------------------------
// Overall instance class
// ----------------------------------------------------------------------

typedef struct _awe_modScalerSmoothedExampleInstance
{
    ModuleInstanceDescriptor instance;
    FLOAT32            gain;                // Target gain
    FLOAT32            smoothingTime;       // Time constant of the smoothing process
    FLOAT32            currentGain;         // Instantaneous gain applied by the module.  This is also the starting gain of the module.
    FLOAT32            smoothingCoeff;      // Smoothing coefficient
    
} awe_modScalerSmoothedExampleInstance;

#if !defined(NOREDEF)
extern const ModClassModule awe_modScalerSmoothedExampleClass;
#endif // #if !defined(NOREDEF)

/* Dynamic instantiation is used by default.  When building for static
** code, define AWE_STATIC_CODE to eliminate the constructor function. */

#ifndef AWE_STATIC_CODE
// This points the constructor for this class to the base constructor
#define awe_modScalerSmoothedExampleConstructor(ARG1, ARG2, ARG3, ARG4, ARG5) ClassModule_Constructor(CLASSID_SCALERSMOOTHEDEXAMPLE, ARG1, ARG2, ARG3, ARG4, ARG5)
#endif // #ifndef AWE_STATIC_CODE


void awe_modScalerSmoothedExampleProcess(void *pInstance);

UINT32 awe_modScalerSmoothedExampleSet(void *pInstance, UINT32 mask);
 



#ifdef __cplusplus
}
#endif


#endif // _MOD_SCALERSMOOTHEDEXAMPLE_H

/**
 * @}
 *
 * End of file.
 */

ModScalerSmoothedExample.c
Anchor
ModScalerSmoothedExample.c
ModScalerSmoothedExample.c

Expand
titleClick to expand "ModScalerSmoothedExample.c" example source
Code Block
/****************************************************************************
*
*               Audio Framework
*               ---------------
*
****************************************************************************
*     ModScalerSmoothedExample.c
****************************************************************************
*
*     Description:  Linear multichannel smoothly varying scaler
*
*     Copyright:    2019 DSP Concepts, Inc. All rights reserved.
*                   3235 Kifer Road
*                   Santa Clara, CA 95054
*
***************************************************************************/

/**
 * @addtogroup Modules
 * @{
 */

/**
 * @file
 * @brief Linear multichannel smoothly varying scaler
 */

#define NOREDEF


#include "Framework.h"
#include "Errors.h"
#include "ModScalerSmoothedExample.h"

#include "FilterDesign.h"

#ifdef __cplusplus
extern "C" {
#endif

/* ----------------------------------------------------------------------
** Audio module class object.  This describes the audio module to the
** framework.  It contains pointers to functions and number of
** variables.
** ------------------------------------------------------------------- */

CREATE_MODULE_CLASS(Class_awe_modScalerSmoothedExample, (4 + 0))

AWE_MOD_SLOW_ANY_CONST
const Class_awe_modScalerSmoothedExample awe_modScalerSmoothedExampleClass =
{
    {
        { NULL, CLASSID_SCALERSMOOTHEDEXAMPLE, },
        awe_modScalerSmoothedExampleProcess,                // Processing function
        IOMatchUpModule_Bypass,                 // Bypass function
        awe_modScalerSmoothedExampleSet,                    // Set function
        0,                                    // Get function
        0x00000007,                      // Module version info
        ClassModule_PackArgCounts(4, 0),    // (Public words, private words)
        {0x0000000F, 0x00000000}, // Specifies which variables are floating-point
    },
#ifdef BUILD64
    {
        offsetof(awe_modScalerSmoothedExampleInstance, gain),
        offsetof(awe_modScalerSmoothedExampleInstance, smoothingTime),
        offsetof(awe_modScalerSmoothedExampleInstance, currentGain),
        offsetof(awe_modScalerSmoothedExampleInstance, smoothingCoeff),
    }
#endif
};


/* ----------------------------------------------------------------------
** Memory allocation function.  This is required because the module
** requires additional memory outside of its instance structure.
** ------------------------------------------------------------------- */


/* ----------------------------------------------------------------------
** Real-time Processing function.
** ------------------------------------------------------------------- */

AWE_MOD_FAST_CODE
void awe_modScalerSmoothedExampleProcess(void *pInstance)
{
    awe_modScalerSmoothedExampleInstance *S = (awe_modScalerSmoothedExampleInstance *)pInstance;
    WireInstance **pWires = ClassModule_GetWires(S);
    FLOAT32 targetGain = S->gain;
    FLOAT32 smoothingCoeff = S->smoothingCoeff;
    FLOAT32 *src = (FLOAT32 *)pWires[0]->buffer;
    FLOAT32 *dst = (FLOAT32 *)pWires[1]->buffer;
    UINT32 channels = ClassWire_GetChannelCount(pWires[0]);
    UINT32 blockSize = ClassWire_GetBlockSize(pWires[0]);
    FLOAT32 currentGain;
    UINT32 i;
    FLOAT32 *inPtr;
    FLOAT32 *outPtr;
    FLOAT32 oneMinusRate = 1.0f - smoothingCoeff;
    INT32 sample;
    
    for (i = 0; i < channels; i++)
    {
        /* The same currentGain is used for each channel. Then we store the result
           from the final channel back into the state. */
        currentGain = S->currentGain;
        
        /*awe_vecScaleSmooth(src + i, channels, dst + i, channels, &currentGain, targetGain,
                  smoothingCoeff, blockSize);*/
                  
        inPtr = src + i;
        outPtr = dst + i;
        
        for(sample = 0; sample < (INT32)blockSize; sample++)
        {
            currentGain = currentGain * oneMinusRate + targetGain * smoothingCoeff;
            
            *outPtr = *inPtr * currentGain;
            
            inPtr += channels;
            outPtr += channels;
        }
    }
    
    S->currentGain = currentGain;
}

/* ----------------------------------------------------------------------
** Set function which updates derived parameters based on the
** module's interface variables.
** ------------------------------------------------------------------- */

AWE_MOD_SLOW_CODE
UINT32 awe_modScalerSmoothedExampleSet(void *pInstance, UINT32 mask)
{
    awe_modScalerSmoothedExampleInstance *S = (awe_modScalerSmoothedExampleInstance *) pInstance;
    WireInstance **pWires = ClassModule_GetWires(S);
    FLOAT32 SR;
    
    if (mask & MASK_ScalerSmoothedExample_smoothingTime)
    {
        SR = (float) ClassWire_GetSampleRate(pWires[0]);
    
        S->smoothingCoeff = design_smoother(S->smoothingTime, SR, 1);
    }
    
    return(0);
}



#ifdef __cplusplus
}
#endif

/**
 * @}
 *
 * End of file.
 */

classids.csv

Expand
titleClick to expand "classids.csv" example source
Code Block
% Class ID list for the examples that are included in the Audio Weaver
% documentation.

IDOFFSET=32768

ScalerSmoothedExample,0
ScalerExample,1
FaderExample,2
FaderExampleFract32,3
PeakHoldExample,4
DownsamplerExample,5
LAHLimiterExample,6
PeakHoldExampleFract32,7
FeedbackExample,8

ExamplesSchema.sch
Anchor
ExamplesSchema.sch
ExamplesSchema.sch

Expand
titleClick to expand "ExamplesSchema.sch" example source
Code Block
ModuleDownsamplerExample 0xBEEF8805, BaseModule

{

    D                       int        // Decimation factor.  1 out of every D samples is output
}

ModuleFaderExampleFract32 0xBEEF8803, BaseModule

{

    scaleFval               float      // Scaler Front
    scaleBval               float      // Scaler Back
    smoothingTimeF          float      // Time constant of the smoothing process
    smoothingTimeB          float      // Time constant of the smoothing process
    scalerF                 *ModuleScalerSmoothedFract32 // Linear multichannel smoothly varying scaler
    scalerB                 *ModuleScalerSmoothedFract32 // Linear multichannel smoothly varying scaler
    inter                   *ModuleInterleave // Interleaves multiple audio signals
}

ModuleFaderExample 0xBEEF8802, BaseModule

{

    fade                    float      // Front/back Balance.  +1 = front only.  -1 = rear only.
    smoothingTime           float      // Time constant of the smoothing process
    scalerF                 *ModuleScalerSmoothed // Gain control with linear units and smoothing
    scalerB                 *ModuleScalerSmoothed // Gain control with linear units and smoothing
    inter                   *ModuleInterleave // Interleaves multiple audio signals
}

ModuleLAHLimiterExample 0xBEEF8806, BaseModule

{

    maxDelayTime            float      // Maximum delay time
    max_abs                 *ModuleMaxAbs // Computes the maximum absolute value of all input channels on a sample-by-sample basis
    core                    *ModuleAGCLimiterCore // Gain computer used to realize soft-knee peak limiters
    delay                   *ModuleDelayMsec // Time delay in which the delay is specified in milliseconds
    mult                    *ModuleAGCMultiplier // Mono x N-channel multiplier
}

ModulePeakHoldExampleFract32 0xBEEF8807, BaseModule

{

    Reset                   int        // reset the current peak values
    attackTime              float      // Envelope detector attack time constant
    decayTime               float      // Envelope detector decay time constant
    decayCoef               fract32    // Computed coefficient used for decay
    attackCoef              fract32    // Computed coefficient used for attack
    peakHold                *fract32   // Array of peak values
    peakDecay               *fract32   // Array of decaying peak values
}

ModulePeakHoldExample 0xBEEF8804, BaseModule

{

    Reset                   int        // reset the current peak values
    attackTime              float      // Envelope detector attack time constant
    decayTime               float      // Envelope detector decay time constant
    decayCoef               float      // Computed coefficient used for decay
    attackCoef              float      // Computed coefficient used for attack
    peakHold                *float     // Array of peak values
    peakDecay               *float     // Array of decaying peak values
}

ModuleScalerExample 0xBEEF8801, BaseModule

{

    gain                    float      // Linear gain
}

ModuleScalerSmoothedExample 0xBEEF8800, BaseModule

{

    gain                    float      // Target gain
    smoothingTime           float      // Time constant of the smoothing process
    currentGain             float      // Instantaneous gain applied by the module.  This is also the starting gain of the module.
    smoothingCoeff          float      // Smoothing coefficient
}

ExamplesSchema.cpp

Note: no example source for ExamplesSchema.cpp is shown, as this is a C file with initialized binary arrays.

Examples.h

Expand
titleClick to expand "Examples.h" example source
Code Block
extern const ModClassModule awe_modDownsamplerExampleClass;
extern const ModClassModule awe_modFaderExampleFract32Class;
extern const ModClassModule awe_modFaderExampleClass;
extern const ModClassModule awe_modLAHLimiterExampleClass;
extern const ModClassModule awe_modPeakHoldExampleFract32Class;
extern const ModClassModule awe_modPeakHoldExampleClass;
extern const ModClassModule awe_modScalerExampleClass;
extern const ModClassModule awe_modScalerSmoothedExampleClass;


#define LISTOFCLASSOBJECTS \
&awe_modDownsamplerExampleClass, \
&awe_modFaderExampleFract32Class, \
&awe_modFaderExampleClass, \
&awe_modLAHLimiterExampleClass, \
&awe_modPeakHoldExampleFract32Class, \
&awe_modPeakHoldExampleClass, \
&awe_modScalerExampleClass, \
&awe_modScalerSmoothedExampleClass

#define USESDLLS "ModulePackAweDeprecatedDLL.dll""

...