// *********************************************************************************************************************
// 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.