Files
TeslaRel410/CODE/RP/MUNGA_L4/L4AUDHDW.TCP
T
CydandClaude Fable 5 fdd9ac9d97 Initial import: Tesla Release 4.10 (Tesla:BattleTech & Tesla:Red Planet)
Archival snapshot of the Virtual World Entertainment Tesla cockpit
software, 1994-1996: MUNGA engine and L4 pod layer source (Borland
C++ 5.0), BT/RP game code, and game content (models, audio, maps,
gauges, Division renderer data). Includes third-party libraries:
Division dVS/DPL graphics, HMI SOS audio, WATTCP networking.

Files are preserved byte-for-byte (.gitattributes disables all
line-ending conversion). README.md documents the layout, target
hardware, and toolchain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:21:58 -05:00

1855 lines
44 KiB
Plaintext

//===========================================================================//
// File: audhdw.thh //
// Project: MUNGA Brick: Audio Manager //
// Contents: Spec for audio manager //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 01/25/95 ECH Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1994, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include <fstream.h>
#include <time.h>
#include <conio.h>
#define BUILD_NOISE_PHASE_TEST
//#define BUILD_TONE_PHASE_TEST
//#define BUILD_LOUDNESS_TEST
//#define BUILD_CHAN_TEST
//#define BUILD_SND_PLAY
//
//#############################################################################
// TonePhaseTest
//#############################################################################
//
class TonePhaseTest SIGNATURED
{
public:
typedef enum
{
InPhase = 1,
OutOfPhase,
FrontSpeakers,
RearSpeakers,
StartTone,
PrintMenu,
StopCurrentTest
} Command;
TonePhaseTest(AudioHardware *audio_hardware);
Logical TestInstance() const;
void Run();
void DoCommand(Command command);
AudioHardware *audioHardware;
Command phaseCommand;
Command positionCommand;
short program;
Logical runningTest;
};
TonePhaseTest::TonePhaseTest(AudioHardware *audio_hardware)
{
Check(audio_hardware);
audioHardware = audio_hardware;
phaseCommand = InPhase;
positionCommand = FrontSpeakers;
program = 0;
runningTest = False;
}
Logical
TonePhaseTest::TestInstance() const
{
Check(audioHardware);
return True;
}
void
TonePhaseTest::Run()
{
Check(this);
Logical quit_test = False;
int input_char;
//
// Load SBKs
//
Check(audioHardware);
audioHardware->GetFrontCard()->LoadSBK("tonephaz.sbk");
audioHardware->GetRearCard()->LoadSBK("tonephaz.sbk");
DoCommand(PrintMenu);
while (!quit_test)
{
//
// Get event from keyboard
//
if (kbhit())
{
input_char = getch();
if (input_char == '' && !runningTest)
{
quit_test = True;
continue;
}
else if (input_char == '' && runningTest)
{
DoCommand(StopCurrentTest);
DoCommand(PrintMenu);
}
else
{
Command input_command = (Command)(input_char - '0');
if (input_command >= InPhase && input_command <= StartTone)
{
DoCommand(StopCurrentTest);
DoCommand(input_command);
}
}
}
}
}
void
TonePhaseTest::DoCommand(Command command)
{
Check(this);
Logical start_test = False;
//
// Do the command
//
switch (command)
{
case InPhase:
Tell("In Phase\n");
phaseCommand = InPhase;
break;
case OutOfPhase:
Tell("Out Of Phase\n");
phaseCommand = OutOfPhase;
break;
case FrontSpeakers:
Tell("Front speakers\n");
positionCommand = FrontSpeakers;
break;
case RearSpeakers:
Tell("Rear speakers\n");
positionCommand = RearSpeakers;
break;
case StartTone:
Tell("Start Tone\n");
if (phaseCommand == InPhase)
program = 0;
else
program = 1;
start_test = True;
break;
case PrintMenu:
//
// Print menu
//
Tell("\n");
Tell("<1> In Phase\n");
Tell("<2> Out Of Phase\n");
Tell("<3> Front speakers\n");
Tell("<4> Rear speakers\n");
Tell("<5> Start Tone\n");
Tell("<esc> to end\n\n");
break;
case StopCurrentTest:
if (runningTest)
{
Tell("End current test\n");
if (positionCommand == FrontSpeakers)
{
audioHardware->GetFrontCard()->SendNoteOff(0, 60, 0);
}
else
{
audioHardware->GetRearCard()->SendNoteOff(0, 60, 0);
}
runningTest = False;
}
break;
}
if (start_test)
{
if (positionCommand == FrontSpeakers)
{
audioHardware->GetFrontCard()->SendController(0, 121, 1); // Reset
audioHardware->GetFrontCard()->SendController(0, 0, 1); // Bank
audioHardware->GetFrontCard()->SendController(0, 91, 0); // Reverb
audioHardware->GetFrontCard()->SendController(0, 93, 0); // Chorus
audioHardware->GetFrontCard()->SendProgramChange(0, program);
audioHardware->GetFrontCard()->SendNoteOn(0, 60, 127);
}
else
{
audioHardware->GetRearCard()->SendController(0, 121, 1); // Reset
audioHardware->GetRearCard()->SendController(0, 0, 1); // Bank
audioHardware->GetRearCard()->SendController(0, 91, 0); // Reverb
audioHardware->GetRearCard()->SendController(0, 93, 0); // Chorus
audioHardware->GetRearCard()->SendProgramChange(0, program);
audioHardware->GetRearCard()->SendNoteOn(0, 60, 127);
}
runningTest = True;
}
}
//
//#############################################################################
// NoisePhaseTest
//#############################################################################
//
class NoisePhaseTest SIGNATURED
{
public:
typedef enum
{
InPhase = 1,
OutOfPhase,
FrontSpeakers,
RearSpeakers,
AllSpeakers,
LowNoise,
MidNoise,
HighNoise,
PrintMenu,
StopCurrentTest
} Command;
NoisePhaseTest(AudioHardware *audio_hardware);
Logical TestInstance() const;
void Run();
void DoCommand(Command command);
AudioHardware *audioHardware;
Command phaseCommand;
Command positionCommand;
short program;
Logical runningTest;
};
NoisePhaseTest::NoisePhaseTest(AudioHardware *audio_hardware)
{
Check(audio_hardware);
audioHardware = audio_hardware;
phaseCommand = InPhase;
positionCommand = FrontSpeakers;
program = 0;
runningTest = False;
}
Logical
NoisePhaseTest::TestInstance() const
{
Check(audioHardware);
return True;
}
void
NoisePhaseTest::Run()
{
Check(this);
Logical quit_test = False;
int input_char;
//
// Load SBKs
//
Check(audioHardware);
audioHardware->GetFrontCard()->LoadSBK("noizphaz.sbk");
audioHardware->GetRearCard()->LoadSBK("noizphaz.sbk");
DoCommand(PrintMenu);
while (!quit_test)
{
//
// Get event from keyboard
//
if (kbhit())
{
input_char = getch();
if (input_char == '' && !runningTest)
{
quit_test = True;
continue;
}
else if (input_char == '' && runningTest)
{
DoCommand(StopCurrentTest);
DoCommand(PrintMenu);
}
else
{
Command input_command = (Command)(input_char - '0');
if (input_command >= InPhase && input_command <= HighNoise)
{
DoCommand(StopCurrentTest);
DoCommand(input_command);
}
}
}
}
}
void
NoisePhaseTest::DoCommand(Command command)
{
Check(this);
Logical start_test = False;
//
// Do the command
//
switch (command)
{
case InPhase:
Tell("In Phase\n");
phaseCommand = InPhase;
break;
case OutOfPhase:
Tell("Out Of Phase\n");
phaseCommand = OutOfPhase;
break;
case FrontSpeakers:
Tell("Front speakers\n");
positionCommand = FrontSpeakers;
break;
case RearSpeakers:
Tell("Rear speakers\n");
positionCommand = RearSpeakers;
break;
case AllSpeakers:
Tell("All speakers\n");
positionCommand = AllSpeakers;
break;
case LowNoise:
Tell("Start Low noise\n");
if (phaseCommand == InPhase)
program = 4;
else
program = 5;
start_test = True;
break;
case MidNoise:
Tell("Start Med noise\n");
if (phaseCommand == InPhase)
program = 2;
else
program = 3;
start_test = True;
break;
case HighNoise:
Tell("Start High noise\n");
if (phaseCommand == InPhase)
program = 0;
else
program = 1;
start_test = True;
break;
case PrintMenu:
//
// Print menu
//
Tell("\n");
Tell("<1> In Phase\n");
Tell("<2> Out Of Phase\n");
Tell("<3> Front speakers\n");
Tell("<4> Rear speakers\n");
Tell("<5> All speakers\n");
Tell("<6> Start Low noise\n");
Tell("<7> Start Med noise\n");
Tell("<8> Start High noise\n");
Tell("<esc> to end\n\n");
break;
case StopCurrentTest:
if (runningTest)
{
Tell("End current test\n");
if (positionCommand == FrontSpeakers || positionCommand == AllSpeakers)
{
audioHardware->GetFrontCard()->SendNoteOff(0, 60, 0);
}
if (positionCommand == RearSpeakers || positionCommand == AllSpeakers)
{
audioHardware->GetRearCard()->SendNoteOff(0, 60, 0);
}
runningTest = False;
}
break;
}
if (start_test)
{
if (positionCommand == FrontSpeakers || positionCommand == AllSpeakers)
{
audioHardware->GetFrontCard()->SendController(0, 121, 1); // Reset
audioHardware->GetFrontCard()->SendController(0, 0, 1); // Bank
audioHardware->GetFrontCard()->SendController(0, 91, 0); // Reverb
audioHardware->GetFrontCard()->SendController(0, 93, 0); // Chorus
audioHardware->GetFrontCard()->SendProgramChange(0, program);
audioHardware->GetFrontCard()->SendNoteOn(0, 60, 127);
}
if (positionCommand == RearSpeakers || positionCommand == AllSpeakers)
{
audioHardware->GetRearCard()->SendController(0, 121, 1); // Reset
audioHardware->GetRearCard()->SendController(0, 0, 1); // Bank
audioHardware->GetRearCard()->SendController(0, 91, 0); // Reverb
audioHardware->GetRearCard()->SendController(0, 93, 0); // Chorus
audioHardware->GetRearCard()->SendProgramChange(0, program);
audioHardware->GetRearCard()->SendNoteOn(0, 60, 127);
}
runningTest = True;
}
}
//
//#############################################################################
// LoudnessTest
//#############################################################################
//
#define AWE_VOL_ENV_VAR "AWE_MASTER_VOLUME"
class LoudnessTest SIGNATURED
{
public:
typedef enum
{
SetLevel = 1,
PlayNoise,
StopNoise,
PrintMenu
} Command;
LoudnessTest(AudioHardware *audio_hardware);
Logical TestInstance() const;
void Run();
void DoCommand(Command command);
AudioHardware *audioHardware;
Command command;
Logical runningTest;
int currentVolume;
};
LoudnessTest::LoudnessTest(AudioHardware *audio_hardware)
{
char *loudness_environment;
if ((loudness_environment = getenv(AWE_VOL_ENV_VAR)) == NULL)
currentVolume = 160;
else
currentVolume = atoi(loudness_environment);
Check(audio_hardware);
audioHardware = audio_hardware;
command = PlayNoise;
runningTest = False;
}
Logical
LoudnessTest::TestInstance() const
{
Check(audioHardware);
return True;
}
void
LoudnessTest::Run()
{
Check(this);
Logical quit_test = False;
int input_char;
//
// Load SBKs
//
Check(audioHardware);
audioHardware->GetFrontCard()->LoadSBK("loudness.sbk");
audioHardware->GetRearCard()->LoadSBK("loudness.sbk");
DoCommand(PrintMenu);
DoCommand(PlayNoise);
while (!quit_test)
{
//
// Get event from keyboard
//
if (kbhit())
{
input_char = getch();
if (input_char == '')
{
DoCommand(StopNoise);
quit_test = True;
}
else
{
Command input_command = (Command)(input_char - '0');
if (input_command == SetLevel)
{
DoCommand(StopNoise);
DoCommand(SetLevel);
quit_test = True;
}
}
}
}
}
void
LoudnessTest::DoCommand(Command command)
{
Check(this);
//
// Do the command
//
switch (command)
{
case PlayNoise:
audioHardware->GetFrontCard()->SendController(0, 121, 1); // Reset
audioHardware->GetFrontCard()->SendController(0, 0, 1); // Bank
audioHardware->GetFrontCard()->SendController(0, 91, 0); // Reverb
audioHardware->GetFrontCard()->SendController(0, 93, 0); // Chorus
audioHardware->GetFrontCard()->SendProgramChange(0, 0);
audioHardware->GetFrontCard()->SendNoteOn(0, 60, 127);
audioHardware->GetRearCard()->SendController(0, 121, 1); // Reset
audioHardware->GetRearCard()->SendController(0, 0, 1); // Bank
audioHardware->GetRearCard()->SendController(0, 91, 0); // Reverb
audioHardware->GetRearCard()->SendController(0, 93, 0); // Chorus
audioHardware->GetRearCard()->SendProgramChange(0, 0);
audioHardware->GetRearCard()->SendNoteOn(0, 60, 127);
break;
case StopNoise:
audioHardware->GetFrontCard()->SendNoteOff(0, 60, 0);
audioHardware->GetRearCard()->SendNoteOff(0, 60, 0);
break;
case SetLevel:
{
//
// Read the specified input level
//
int input_level = -1;
while (input_level < 0 || 255 < input_level)
{
Tell(
"\nSet Level (0-255) (Current Level=" <<
currentVolume <<
"): "
);
cin >> input_level;
if (input_level < 0 || 255 < input_level)
{
Tell("Valid entries are 0 to 255.\n");
}
}
//
// Write the bat file
//
ofstream output_file("setvol.bat", ios::out);
Verify(output_file);
output_file << "set " << AWE_VOL_ENV_VAR "=" << input_level << "\n";
}
break;
case PrintMenu:
//
// Print menu
//
Tell("\n");
Tell("Current Level=" << currentVolume << "\n");
Tell("\n");
Tell("<1> Set Level\n");
Tell("<esc> to end\n\n");
break;
}
}
//
//#############################################################################
// TestClass
//#############################################################################
//
#define RAD360 (6.28318)
Logical
AudioHardware::TestClass()
{
AudioHardware audio_hardware;
audio_hardware.Initialize();
//
//--------------------------------------------------------------------------
// Noise Phase Test
//--------------------------------------------------------------------------
//
#if defined(BUILD_NOISE_PHASE_TEST)
{
NoisePhaseTest noise_phase_test(&audio_hardware);
noise_phase_test.Run();
}
#endif
//
//--------------------------------------------------------------------------
// Tone Phase Test
//--------------------------------------------------------------------------
//
#if defined(BUILD_TONE_PHASE_TEST)
{
TonePhaseTest tone_phase_test(&audio_hardware);
tone_phase_test.Run();
}
#endif
//
//--------------------------------------------------------------------------
// Loudness Test
//--------------------------------------------------------------------------
//
#if defined(BUILD_LOUDNESS_TEST)
{
LoudnessTest loudness_test(&audio_hardware);
loudness_test.Run();
}
#endif
//
//------------------------------------------------------------------
// Revised Speaker Channel Test
//------------------------------------------------------------------
//
#if defined(BUILD_CHAN_TEST)
{
clock_t end_time;
MIDIValue channel;
MIDIValue panValue;
MIDIValue program;
int speakSelect, front, rear, waitTime;
speakSelect = 1;
waitTime = 4;
//
// Load SBKs
//
audio_hardware.frontCard.LoadSBK("chantest.sbk");
audio_hardware.rearCard.LoadSBK("chantest.sbk");
//
// Init channels
//
channel = 0;
{
//
// Set to second bank
//
// Card 1
audio_hardware.frontCard.SendController(channel, 121, 1); // Reset
audio_hardware.frontCard.SendController(channel, 0, 1); // Bank
audio_hardware.frontCard.SendController(channel, 91, 0); // Reverb
audio_hardware.frontCard.SendController(channel, 93, 0); // Chorus
// Card 2
audio_hardware.rearCard.SendController(channel, 121, 1); // Reset
audio_hardware.rearCard.SendController(channel, 0, 1); // Bank
audio_hardware.rearCard.SendController(channel, 91, 0); // Reverb
audio_hardware.rearCard.SendController(channel, 93, 0); // Chorus
}
//
// Cycle through speaker channels
//
Tell("\n");
Tell("<1> rear-left\n");
Tell("<2> rear-center\n");
Tell("<3> rear-right\n");
Tell("<4> front & rear-left\n");
Tell("<5> front & rear-center\n");
Tell("<6> front & rear-right\n");
Tell("<7> front-left\n");
Tell("<8> front-center\n");
Tell("<9> front-right\n");
Tell("<esc> to end\n\n");
while (speakSelect != -1)
{
switch (speakSelect){
case 1:
front = 0;
rear = 1;
panValue = 0;
Tell("Tones in rear-left\n");
break;
case 2:
front = 0;
rear = 1;
panValue = 63;
Tell("Tones in rear-center\n");
break;
case 3:
front = 0;
rear = 1;
panValue = 127;
Tell("Tones in rear-right\n");
break;
case 4:
front = 1;
rear = 1;
panValue = 0;
Tell("Tones in front & rear-left\n");
break;
case 5:
front = 1;
rear = 1;
panValue = 63;
Tell("Tones in front & rear-center\n");
break;
case 6:
front = 1;
rear = 1;
panValue = 127;
Tell("Tones in front & rear-right\n");
break;
case 7:
front = 1;
rear = 0;
panValue = 0;
Tell("Tones in front-left\n");
break;
case 8:
front = 1;
rear = 0;
panValue = 63;
Tell("Tones in front-center\n");
break;
case 9:
front = 1;
rear = 0;
panValue = 127;
Tell("Tones in front-right\n");
break;
default:
break;
};
// Set Speaker Channel
if (front){
//audio_hardware.frontCard.SendController(0, 121, 1); // Reset
//audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 0); // Pgm
audio_hardware.frontCard.SendController(0, 10, panValue); // Pan
}
if (rear) {
//audio_hardware.rearCard.SendController(0, 121, 1); // Reset
//audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 0); // Pgm
audio_hardware.rearCard.SendController(0, 10, panValue); // Pan
}
// Play tones
for (program = 0; program < 7; program++)
{
//
// Set program
//
audio_hardware.frontCard.SendProgramChange(0, program);
audio_hardware.rearCard.SendProgramChange(0, program);
//
// Play note
//
if (front)
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
if (rear)
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
end_time = clock() + waitTime*CLOCKS_PER_SEC;
while (clock() < end_time)
{
}
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
if (kbhit())
{
switch (getch()){
case '':
speakSelect = -1;
break;
case '1':
speakSelect = 1;
break;
case '2':
speakSelect = 2;
break;
case '3':
speakSelect = 3;
break;
case '4':
speakSelect = 4;
break;
case '5':
speakSelect = 5;
break;
case '6':
speakSelect = 6;
break;
case '7':
speakSelect = 7;
break;
case '8':
speakSelect = 8;
break;
case '9':
speakSelect = 9;
break;
default:
break;
};
break;
}
}
}
}
#endif
//
//------------------------------------------------------------------
// Sound Play Test
//
// Requires "test.sbk"
//------------------------------------------------------------------
//
#if defined(BUILD_SND_PLAY)
{
MIDIValue channel;
MIDIValue progSelect;
int noteIsOn, prognum;
char ch;
Tell("AudioHardware::TestClass\n");
//
// Load SBKs
//
audio_hardware.frontCard.LoadSBK("test.sbk");
audio_hardware.rearCard.LoadSBK("test.sbk");
//
// Init channel
// Set to second bank
//
channel = 0;
// Card 1
audio_hardware.frontCard.SendController(
channel, MIDI_CONTROL_RESET, 1
);
audio_hardware.frontCard.SendController(
channel, MIDI_PAN_CONTROL, MIDI_CENTER_PAN_VALUE
);
audio_hardware.frontCard.SendController(
channel, MIDI_REVERB_CONTROL, MIDI_MIN_CONTROL_VALUE
);
audio_hardware.frontCard.SendController(
channel, MIDI_CHORUS_CONTROL, MIDI_MIN_CONTROL_VALUE
);
audio_hardware.frontCard.SelectBank(channel, 1);
// Card 2
audio_hardware.rearCard.SendController(
channel, MIDI_CONTROL_RESET, 1
);
audio_hardware.rearCard.SendController(
channel, MIDI_PAN_CONTROL, MIDI_CENTER_PAN_VALUE
);
audio_hardware.rearCard.SendController(
channel, MIDI_REVERB_CONTROL, MIDI_MIN_CONTROL_VALUE
);
audio_hardware.rearCard.SendController(
channel, MIDI_CHORUS_CONTROL, MIDI_MIN_CONTROL_VALUE
);
audio_hardware.rearCard.SelectBank(channel, 1);
//
// Select program number
//
Tell("\nPlay program number (-1 to quit): ");
cin >> prognum;
progSelect = (MIDIValue)prognum;
Tell("\nPress <space> to start or stop playing.\n");
Tell("Hit <esc> to select a new program.\n");
while (prognum != -1)
{
// Set Program
audio_hardware.frontCard.SendProgramChange(channel, progSelect);
audio_hardware.rearCard.SendProgramChange(channel, progSelect);
audio_hardware.frontCard.SendNoteOn(channel, 60, 127);
audio_hardware.rearCard.SendNoteOn(channel, 60, 127);
noteIsOn = 1;
ch = (char)getch();
while (ch != ''){
if (ch == ' ')
if (noteIsOn){
Tell(" Note off\n");
audio_hardware.frontCard.SendNoteOff(channel, 60, 0);
audio_hardware.rearCard.SendNoteOff(channel, 60, 0);
noteIsOn = 0;
} else {
Tell(" Note on\n");
audio_hardware.frontCard.SendNoteOn(channel, 60, 127);
audio_hardware.rearCard.SendNoteOn(channel, 60, 127);
noteIsOn = 1;
}
ch = (char)getch();
}
audio_hardware.frontCard.SendNoteOff(channel, 60, 0);
audio_hardware.rearCard.SendNoteOff(channel, 60, 0);
Tell("\nPlay program number (-1 to quit): ");
cin >> prognum;
progSelect = (MIDIValue)prognum;
}
}
#endif
//
//------------------------------------------------------------------
// Sequence through channels and notes
//------------------------------------------------------------------
//
#if 0
{
MIDIValue channel;
MIDIValue key;
//
// Init channels
//
for (channel = 0; channel < 16; channel++) {
//
// Set to first bank, first program
//
// Card 1
audio_hardware.frontCard.SendController(channel, 0, 0);
audio_hardware.frontCard.SendProgramChange(channel, 0);
// Card 2
audio_hardware.rearCard.SendController(channel, 0, 0);
audio_hardware.rearCard.SendProgramChange(channel, 0);
}
//
// Play sequence of keys
//
Tell("Sequence through channels and notes - Press ESC to stop\n");
for (channel = 0; channel < 16; channel++)
{
for (key = 60; key < 60+12; key++)
{
clock_t next_key_time;
Tell("channel " << (int)channel << " key " << (int)key << "\n");
// Card 1
audio_hardware.frontCard.SendNoteOn(channel, key, 127);
// Card 2
audio_hardware.rearCard.SendNoteOn(channel, key, 127);
next_key_time = clock() + CLOCKS_PER_SEC/10;
while (clock() < next_key_time)
{
}
}
for (key = 60; key < 60+12; key++) {
// Card 1
audio_hardware.frontCard.SendNoteOff(channel, key, 127);
// Card 2
audio_hardware.rearCard.SendNoteOff(channel, key, 127);
}
if (kbhit())
{
if (getch() == '')
break;
}
}
}
#endif
//
//------------------------------------------------------------------
// Sequence through programs
//------------------------------------------------------------------
//
#if 0
{
clock_t end_time;
MIDIValue channel;
MIDIValue program;
//
// Init channels
//
for (channel = 0; channel < 16; channel++)
{
//
// Set to second bank
//
// Card 1
audio_hardware.frontCard.SendController(channel, 121, 1); // Reset
audio_hardware.frontCard.SendController(channel, 0, 1);
// Card 2
audio_hardware.rearCard.SendController(channel, 121, 1); // Reset
audio_hardware.rearCard.SendController(channel, 0, 1);
}
//
// Sequence through programs
//
for (program = 0; program < 128; program++)
{
//
// Set program
//
audio_hardware.frontCard.SendProgramChange(0, program);
audio_hardware.rearCard.SendProgramChange(0, program);
Tell("Program " << (int)program << "\n");
//
// Play note
//
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
end_time = clock() + 8*CLOCKS_PER_SEC;
while (clock() < end_time)
{
}
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
if (kbhit())
{
if (getch() == '')
break;
}
}
}
#endif
//
//------------------------------------------------------------------
// Test front volume controller
//------------------------------------------------------------------
//
#if 0
{
clock_t start_time, period, end_time;
float fvol;
MIDIValue vol;
//
// Modulate volume
//
Tell("Volume should be modulated in the front\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
period = 2*CLOCKS_PER_SEC;
start_time = clock();
end_time = start_time + 4*period;
while (clock() < end_time)
{
fvol = sin(RAD360 * (float)(clock() - start_time) / (float)period);
fvol += 1.0;
fvol *= 63.0;
vol = fvol;
// Card 1
audio_hardware.frontCard.SendController(0, 7, vol);
Tell(" vol " << (int)vol);
if (kbhit())
{
if (getch() == '')
break;
}
}
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendController(0, 7, 127);
Tell("\n");
}
#endif
//
//------------------------------------------------------------------
// Test rear volume controller
//------------------------------------------------------------------
//
#if 0
{
clock_t start_time, period, end_time;
float fvol;
MIDIValue vol;
//
// Modulate volume
//
Tell("Volume should be modulated in the rear\n");
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 2); // Pgm
audio_hardware.rearCard.SendController(0, 10, 63); // Pan Center
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
period = 2*CLOCKS_PER_SEC;
start_time = clock();
end_time = start_time + 4*period;
while (clock() < end_time)
{
fvol = sin(RAD360 * (float)(clock() - start_time) / (float)period);
fvol += 1.0;
fvol *= 63.0;
vol = fvol;
// Card 2
audio_hardware.rearCard.SendController(0, 7, vol);
Tell(" vol " << (int)vol);
if (kbhit())
{
if (getch() == '')
break;
}
}
// Card 2
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendController(0, 7, 127);
Tell("\n");
}
#endif
//
//------------------------------------------------------------------
// Test pan controller
//------------------------------------------------------------------
//
#if 0
{
clock_t end_time;
// Card 1
audio_hardware.frontCard.SendController(0, 91, 0); // Reverb
audio_hardware.frontCard.SendController(0, 93, 0); // Chorus
// Card 2
audio_hardware.rearCard.SendController(0, 91, 0); // Reverb
audio_hardware.rearCard.SendController(0, 93, 0); // Chorus
//
// Pan left
//
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 0); // Pgm
audio_hardware.frontCard.SendController(0, 10, 0); // Pan left
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 0); // Pgm
audio_hardware.rearCard.SendController(0, 10, 0); // Pan left
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
Tell("Note should be panned left\n");
end_time = clock() + 4*CLOCKS_PER_SEC;
while (clock() < end_time)
{
}
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
// Card 2
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
//
// Pan Right
//
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 1); // Pgm
audio_hardware.frontCard.SendController(0, 10, 127); // Pan right
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 1); // Pgm
audio_hardware.rearCard.SendController(0, 10, 127); // Pan right
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
Tell("Note should be panned right\n");
end_time = clock() + 4*CLOCKS_PER_SEC;
while (clock() < end_time)
{
}
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
// Card 2
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
}
#endif
//
//------------------------------------------------------------------
// Test pitch bend
//------------------------------------------------------------------
//
#if 0
{
clock_t start_time, period, end_time;
float fpitch;
MIDIPitchBend pitch;
//
// Modulate pitch
//
Tell("Pitch should be modulated\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 2); // Pgm
audio_hardware.rearCard.SendController(0, 10, 63); // Pan Center
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
period = 2*CLOCKS_PER_SEC;
start_time = clock();
end_time = start_time + 4*period;
while (clock() < end_time)
{
fpitch = sin(RAD360 * (float)(clock() - start_time) / (float)period);
fpitch += 1.0;
fpitch *= 8191.0;
pitch = fpitch;
// Card 1
audio_hardware.frontCard.SendPitchBend(0, pitch);
// Card 2
audio_hardware.rearCard.SendPitchBend(0, pitch);
Tell("pitch " << (int)pitch << "\n");
if (kbhit())
{
if (getch() == '')
break;
}
}
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendPitchBend(0, 8192);
// Card 2
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendPitchBend(0, 8192);
}
#endif
//
//------------------------------------------------------------------
// Test pitch NRPN
//------------------------------------------------------------------
//
#if 0
{
clock_t start_time, period, end_time;
float fpitch;
MIDINRPNValue pitch;
//
// Modulate pitch
//
Tell("Pitch should be modulated\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 2); // Pgm
audio_hardware.rearCard.SendController(0, 10, 63); // Pan Center
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
period = 2*CLOCKS_PER_SEC;
start_time = clock();
end_time = start_time + 4*period;
while (clock() < end_time)
{
fpitch = sin(RAD360 * (float)(clock() - start_time) / (float)period);
fpitch *= 8191.0;
pitch = fpitch;
// Card 1
audio_hardware.frontCard.SendNRPN(0, 16, pitch);
// Card 2
audio_hardware.rearCard.SendNRPN(0, 16, pitch);
Tell("pitch " << (int)pitch << "\n");
if (kbhit())
{
if (getch() == '')
break;
}
}
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendNRPN(0, 16, 0);
// Card 2
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendNRPN(0, 16, 0);
}
#endif
//
//------------------------------------------------------------------
// Test filter cutoff NRPN
//------------------------------------------------------------------
//
#if 0
{
clock_t start_time, period, end_time;
float fcutoff;
MIDINRPNValue cutoff;
//
// Modulate filter cutoff
//
Tell("Filter cutoff should be modulated\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 1); // Bank
audio_hardware.rearCard.SendProgramChange(0, 2); // Pgm
audio_hardware.rearCard.SendController(0, 10, 63); // Pan Center
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
period = 2*CLOCKS_PER_SEC;
start_time = clock();
end_time = start_time + 4*period;
while (clock() < end_time)
{
fcutoff = sin(RAD360 * (float)(clock() - start_time) / (float)period);
fcutoff += 1.0;
fcutoff *= 63.0;
cutoff = fcutoff;
// Card 1
audio_hardware.frontCard.SendNRPN(0, 21, cutoff);
// Card 2
audio_hardware.rearCard.SendNRPN(0, 21, cutoff);
Tell("cutoff " << (int)cutoff << "\n");
if (kbhit())
{
if (getch() == '')
break;
}
}
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendNRPN(0, 21, 127);
// Card 2
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendNRPN(0, 21, 127);
}
#endif
//
//------------------------------------------------------------------
// Test reverb and chorus settings
//------------------------------------------------------------------
//
#if 0
{
clock_t end_time;
int i;
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 0); // Bank
audio_hardware.frontCard.SendProgramChange(0, 0); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
// Card 2
audio_hardware.rearCard.SendController(0, 121, 1); // Reset
audio_hardware.rearCard.SendController(0, 0, 0); // Bank
audio_hardware.rearCard.SendProgramChange(0, 0); // Pgm
audio_hardware.rearCard.SendController(0, 10, 63); // Pan Center
// Card 1
audio_hardware.frontCard.SendController(0, 91, 127); // Reverb
audio_hardware.frontCard.SendController(0, 93, 0); // Chorus
// Card 2
audio_hardware.rearCard.SendController(0, 91, 127); // Reverb
audio_hardware.rearCard.SendController(0, 93, 0); // Chorus
for (i = 0; i < 8; i++)
{
#pragma warn -sig
audio_hardware.frontCard.SelectEffect(ReverbMIDIEffectType, i); // Reverb
audio_hardware.rearCard.SelectEffect(ReverbMIDIEffectType, i); // Reverb
#pragma warn +sig
Tell("Reverb " << i << "\n");
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
end_time = clock() + 3*CLOCKS_PER_SEC;
while (clock() < end_time)
{
}
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
if (kbhit())
{
if (getch() == '')
break;
}
}
// Card 1
audio_hardware.frontCard.SendController(0, 91, 0); // Reverb
audio_hardware.frontCard.SendController(0, 93, 127); // Chorus
// Card 2
audio_hardware.rearCard.SendController(0, 91, 0); // Reverb
audio_hardware.rearCard.SendController(0, 93, 127); // Chorus
for (i = 0; i < 8; i++)
{
#pragma warn -sig
audio_hardware.frontCard.SelectEffect(ChorusMIDIEffectType, i); // Chorus
audio_hardware.rearCard.SelectEffect(ChorusMIDIEffectType, i); // Chorus
#pragma warn +sig
Tell("Chorus " << i << "\n");
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
audio_hardware.rearCard.SendNoteOn(0, 60, 127);
end_time = clock() + 3*CLOCKS_PER_SEC;
while (clock() < end_time)
{
}
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.rearCard.SendNoteOff(0, 60, 0);
if (kbhit())
{
if (getch() == '')
break;
}
}
}
#endif
//
// Close down
//
audio_hardware.Close();
return True;
}
//
//#############################################################################
// ProfileClass
//#############################################################################
//
#define RAD360 (6.28318)
Logical
AudioHardware::ProfileClass()
{
AudioHardware audio_hardware;
Tell("AudioHardware::ProfileClass\n");
//
// Init the audio hardware
//
audio_hardware.Initialize();
audio_hardware.frontCard.LoadSBK("test.sbk");
audio_hardware.rearCard.LoadSBK("test.sbk");
//
//------------------------------------------------------------------
// Sequence through channels and notes
//------------------------------------------------------------------
//
#if 0
{
clock_t start_timer, total_timer;
int number_of_calls;
MIDIValue channel;
MIDIValue key;
//
// Init channels
//
for (channel = 0; channel < 16; channel++) {
//
// Set to first bank, first program
//
// Card 1
audio_hardware.frontCard.SendController(channel, 0, 0);
audio_hardware.frontCard.SendProgramChange(channel, 0);
// Card 2
audio_hardware.rearCard.SendController(channel, 0, 0);
audio_hardware.rearCard.SendProgramChange(channel, 0);
}
//
// Play sequence of keys
//
Tell("Sequence through channels and notes\n");
total_timer = 0;
start_timer = clock();
for (channel = 0; channel < 16; channel++)
{
for (key = 0; key < 128; key++)
{
// Card 1
audio_hardware.frontCard.SendNoteOn(channel, key, 127);
// Card 2
audio_hardware.rearCard.SendNoteOn(channel, key, 127);
}
for (key = 0; key < 128; key++) {
// Card 1
audio_hardware.frontCard.SendNoteOff(channel, key, 127);
// Card 2
audio_hardware.rearCard.SendNoteOff(channel, key, 127);
}
}
total_timer += clock() - start_timer;
number_of_calls = 16 * 2 * 128 * 2;
Tell("Calls " << number_of_calls << " Duration " << total_timer << "\n");
Tell(
"Calls 1000 Duration " <<
(Scalar)total_timer / (Scalar)number_of_calls <<
" secs\n"
);
}
#endif
//
//------------------------------------------------------------------
// Test front volume controller
//------------------------------------------------------------------
//
#if 0
{
clock_t start_timer, total_timer;
int number_of_calls, i;
//
// Modulate volume
//
Tell("Volume modulated in the front\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
number_of_calls = 100000;
i = 0;
total_timer = 0;
start_timer = clock();
while (i < number_of_calls)
{
// Card 1
audio_hardware.frontCard.SendController(0, 7, (MIDIValue)i);
i++;
}
total_timer += clock() - start_timer;
Tell("Calls " << number_of_calls << " Duration " << total_timer << "\n");
Tell(
"Calls 1000 Duration " <<
(Scalar)total_timer / (Scalar)number_of_calls <<
" secs\n"
);
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendController(0, 7, 127);
}
#endif
//
//------------------------------------------------------------------
// Test pitch bend
//------------------------------------------------------------------
//
#if 0
{
clock_t start_timer, total_timer;
int number_of_calls, i;
//
// Modulate pitch
//
Tell("Pitch modulated\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
number_of_calls = 100000;
i = 0;
total_timer = 0;
start_timer = clock();
while (i < number_of_calls)
{
audio_hardware.frontCard.SendPitchBend(0, i);
i++;
}
total_timer += clock() - start_timer;
Tell("Calls " << number_of_calls << " Duration " << total_timer << "\n");
Tell(
"Calls 1000 Duration " <<
(Scalar)total_timer / (Scalar)number_of_calls <<
" secs\n"
);
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendPitchBend(0, 8192);
}
#endif
//
//------------------------------------------------------------------
// Test pitch NRPN
//------------------------------------------------------------------
//
#if 0
{
clock_t start_timer, total_timer;
int number_of_calls, i;
//
// Modulate pitch
//
Tell("Pitch NRPN modulated\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
number_of_calls = 100000;
i = 0;
total_timer = 0;
start_timer = clock();
while (i < number_of_calls)
{
audio_hardware.frontCard.SendNRPN(0, 16, i);
i++;
}
total_timer += clock() - start_timer;
Tell("Calls " << number_of_calls << " Duration " << total_timer << "\n");
Tell(
"Calls 1000 Duration " <<
(Scalar)total_timer / (Scalar)number_of_calls <<
" secs\n"
);
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendNRPN(0, 16, 0);
}
#endif
//
//------------------------------------------------------------------
// Test filter NRPN
//------------------------------------------------------------------
//
#if 0
{
clock_t start_timer, total_timer;
int number_of_calls, i;
//
// Modulate pitch
//
Tell("Filter NRPN modulated\n");
// Card 1
audio_hardware.frontCard.SendController(0, 121, 1); // Reset
audio_hardware.frontCard.SendController(0, 0, 1); // Bank
audio_hardware.frontCard.SendProgramChange(0, 2); // Pgm
audio_hardware.frontCard.SendController(0, 10, 63); // Pan Center
audio_hardware.frontCard.SendNoteOn(0, 60, 127);
number_of_calls = 100000;
i = 0;
total_timer = 0;
start_timer = clock();
while (i < number_of_calls)
{
audio_hardware.frontCard.SendNRPN(0, 21, i);
i++;
}
total_timer += clock() - start_timer;
Tell("Calls " << number_of_calls << " Duration " << total_timer << "\n");
Tell(
"Calls 1000 Duration " <<
(Scalar)total_timer / (Scalar)number_of_calls <<
" secs\n"
);
// Card 1
audio_hardware.frontCard.SendNoteOff(0, 60, 0);
audio_hardware.frontCard.SendNRPN(0, 21, 127);
}
#endif
//
// Close down
//
audio_hardware.Close();
return True;
}