// *********************************************************************************************************************

// This delphi program creates lung, vocal tract, lip valve, mouthpiece and trumpet ready to create time

// domain wave forms. Each evaluation proceeds one time step.

//

// A new shorter method to initialise parameters is demonstrated. Parameter names are abbreviated and

// specified when the model is created. Parameters can be changed after each step

// *********************************************************************************************************************

program TrumpetPlayer();

 

var psim, pimp: pointer;

    pfrq, pcpx: ^double;

    i, alen: integer;

 

begin

// Create Simulator

psim := SimCreate();

 

// Create the Models

SimCreateModel(psim, ‘MyLung‘,‘PressureSource:P=6kPa‘);

 

// SubCircuit VocalTract

SimCreateModel(psim, ‘MyLaryngealCavity‘,‘CylindricalTube:L=6cm,B=5cm‘);

SimCreateModel(psim, ‘MyPharynx‘,‘CylindricalTube:L=6cm,B=5cm‘);

SimCreateModel(psim, ‘MyOralCavity‘,‘CylindricalTube:L=6cm,B=5cm‘);

SimCreateModel(psim, ‘MyLipOrifice‘,‘CylindricalTube:L=6cm,B=5cm‘);

SimCreateArrangement(psim, ‘MyVocalTract‘,‘SubCircuit‘);

SimAppendToArrangement(psim,‘MyVocalTract‘,‘MyLaryngealCavity‘);

SimAppendToArrangement(psim,‘MyVocalTract‘,‘MyPharynx‘);

SimAppendToArrangement(psim,‘MyVocalTract‘,‘MyOralCavity‘);

SimAppendToArrangement(psim,‘MyVocalTract‘,‘MyLipOrifice‘);

 

SimCreateModel(psim, ‘MyLipValve‘,‘SingleMassLipValve:F=440Hz‘);

 

// SubCircuit MouthPiece

SimCreateModel(psim, ‘MyCup‘,‘ConicalTube:L=10mm,B1=12mm,B2=3mm‘);

SimCreateModel(psim, ‘MyBackBore‘,‘ConicalTube:L=80mm,B1=3mm,B2=8mm‘);

SimCreateArrangement(psim, ‘MyMouthPiece‘,‘SubCircuit‘);

SimAppendToArrangement(psim,‘MyMouthPiece‘,‘MyCup‘);

SimAppendToArrangement(psim,‘MyMouthPiece‘,‘MyBackBore‘);

 

// SubCircuit Trumpet

SimCreateModel(psim, ‘MyLeadPipe‘,‘ConicalTube:L=20cm,B1=8mm,B2=12mm‘);

SimCreateModel(psim, ‘MyTube‘,‘CylindricalTube:L=60mm,B=12mm‘);

SimCreateModel(psim, ‘MyBell‘,‘BesselHorn:L=60mm,B1=12mm,B2=120mm‘);

SimCreateArrangement(psim, ‘MyTrumpet‘,‘SubCircuit‘);

SimAppendToArrangement(psim,‘MyTrumpet‘,‘MyLeadPipe‘);

SimAppendToArrangement(psim,‘MyTrumpet‘,‘MyTube‘);

SimAppendToArrangement(psim,‘MyTrumpet‘,‘MyBell‘);

 

SimCreateModel(psim, ‘MyRadiation‘,‘SphericalRadiation:L=3m,B=120mm‘);

SimCreateModel(psim, ‘MyListener‘,‘Listener‘);

 

// Arrange Model References to Create Acoustical Tree

SimCreateArrangement(psim, ‘MyConcerto‘,‘TimeDomain‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref1‘, ‘MyLung‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref2‘, ‘MyVocalTract‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref3‘, ‘MyLipValve‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref4‘, ‘MyMouthPiece‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref5‘, ‘MyTrumpet‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref6‘, ‘MyRadiation‘);

SimAppendToArrangement(psim,‘MyConcerto‘,‘Ref7‘, ‘MyListener‘);

 


// Get Pointer to Resulting Object

pwav := SimWaveForm(psim,‘MyConcerto.MyListener‘);

 

// Create Time Varying Signal Source (Using PWL Model to Create a Ramp)

SimCreateModel(psim, ‘MyLipTension‘,‘PWL:T1=0,Y1=180,T2=5000,Y2=1800‘);

 

// Link Model Parameter

SimSetParameter(psim, ‘MyLipValve.Freq=[MyLipTension.Out]‘);

 

// Calculate 5000 time steps

// Play all air column resonances by linearly increasing lip tension

SimEvaluate(5000);

 

// Retrieve Sound Pressure at Listeners Position

alen := SimGetArrayLen(pwav);

p1 := SimGetArray(pwav, cPressure);

for i := 0 to alen-1 do writeln((p1+i)^);

 

SimDestroy(psim);

end.