< Back to IRCAM Forum

Bowed plate error in MaxMSP

Hey, I’m trying to figure out how to make a bowed plate within Modalys in MaxMSP. I am getting sound, however it happens quite often that I get the following error:
*** ERROR: connection computation error
***
*** ERROR: maximum number of iterations exceeded in connection solver
Please check your accesses for possible incompatible connections
***
SpeedConnection: weight 1, source 0.359052, cross 0.000468049, force -4776.86, 1:(obj bow:bow_access_in_2) position: 0,
Position: weight 1, source -0.233295, cross 1.29878e-09, force -1.55705e+06, 1:(obj bow:bow_access_in_1) position: 0,
StrikeConnection_1: weight 1, source -1.81383, cross -0.173489, force 1257.28, 1:(obj bow:bow_access_out_1) position: 1, 2:(obj plate:plate_access_in_1) position: 0.52,
BowConnection: weight 1, source -7.87421, cross 0.0222775, force 3153.03, 1:(obj bow:bow_access_out_2) position: 1, 2:(obj plate:plate_access_in_2) position: 0.66,

My generated code from MaxMSP is the following:
new()
set_precision(‘float’)
PointInput = make_point_input(0,1.000000)
SignalController = make_controller(‘SIGNAL’,1,PointInput)
bow_c1 = make_controller(‘DYNAMIC’,1,-1,0.01,‘bow@small-mass’)
bow_c2 = make_controller(‘DYNAMIC’,1,-1,0.01,‘bow@large-mass’)
bow_c3 = make_controller(‘DYNAMIC’,1,-1,15000,‘bow@stiffness0’)
bow_c4 = make_controller(‘DYNAMIC’,1,-1,15000,‘bow@stiffness1’)
bow_c5 = make_controller(‘DYNAMIC’,1,-1,100,‘bow@freq-loss0’)
bow_c6 = make_controller(‘DYNAMIC’,1,-1,100,‘bow@freq-loss1’)
bow_c7 = make_controller(‘DYNAMIC’,1,-1,0,‘bow@const-loss0’)
bow_c8 = make_controller(‘DYNAMIC’,1,-1,0,‘bow@const-loss1’)
bow = make_object(‘bi-two-mass’,bow_c1,bow_c2,bow_c3,bow_c4,bow_c5,bow_c6,bow_c7,bow_c8)
bow_pitch = make_controller(‘DYNAMIC’,1,-1,0.000000,‘bow@pitch’)
set_pitch(bow,‘mass’,bow_pitch)
bow_pos_in_1 = make_controller(‘DYNAMIC’,1,-1,[0.000000],‘bow@access-in-1-position’)
bow_access_in_1 = make_access(bow,bow_pos_in_1,‘trans0’)
bow_pos_in_2 = make_controller(‘DYNAMIC’,1,-1,[0.000000],‘bow@access-in-2-position’)
bow_access_in_2 = make_access(bow,bow_pos_in_2,‘trans1’)
bow_pos_out_1 = make_controller(‘DYNAMIC’,1,-1,[1.000000],‘bow@access-out-1-position’)
bow_access_out_1 = make_access(bow,bow_pos_out_1,‘trans0’)
bow_pos_out_2 = make_controller(‘DYNAMIC’,1,-1,[1.000000],‘bow@access-out-2-position’)
bow_access_out_2 = make_access(bow,bow_pos_out_2,‘trans1’)

plate_c1 = make_controller('DYNAMIC',1,-1,80,'plate@modes')
plate_c2 = make_controller('DYNAMIC',1,-1,0.5,'plate@radius')
plate_c3 = make_controller('DYNAMIC',1,-1,0.01,'plate@thickness')
plate_c4 = make_controller('DYNAMIC',1,-1,7800,'plate@density')
plate_c5 = make_controller('DYNAMIC',2,-1,[1.000000 9.000000],'plate@young')
plate_c6 = make_controller('DYNAMIC',1,-1,0.3,'plate@poisson')
plate_c7 = make_controller('DYNAMIC',1,-1,1,'plate@freq-loss')
plate_c8 = make_controller('DYNAMIC',1,-1,1,'plate@const-loss')
plate = make_object('clamped-circ-plate',plate_c1,plate_c2,plate_c3,plate_c4,plate_c5,plate_c6,plate_c7,plate_c8)
plate_pitch = make_controller('DYNAMIC',1,-1,0.000000,'plate@pitch')
set_pitch(plate,'radius',plate_pitch)
plate_pos_in_1 = make_controller('DYNAMIC',2,-1,[0.050000 18.000000],'plate@access-in-1-position')
plate_access_in_1 = make_access(plate,plate_pos_in_1,'NORMAL')
plate_pos_in_2 = make_controller('DYNAMIC',2,-1,[0.150000 54.000000],'plate@access-in-2-position')
plate_access_in_2 = make_access(plate,plate_pos_in_2,'NORMAL')
plate_pos_out_1 = make_controller('DYNAMIC',2,-1,[0.100000 36.000000],'plate@access-out-1-position')
plate_access_out_1 = make_access(plate,plate_pos_out_1,'NORMAL')
plate_pos_out_2 = make_controller('DYNAMIC',2,-1,[0.200000 72.000000],'plate@access-out-2-position')
plate_access_out_2 = make_access(plate,plate_pos_out_2,'NORMAL')

PointOutputL_c1 = make_controller('DYNAMIC',1,-1,1,'PointOutputL@gain')
PointOutputL = make_point_output(plate_access_out_1,0,PointOutputL_c1)
PointOutputR_c1 = make_controller('DYNAMIC',1,-1,1,'PointOutputR@gain')
PointOutputR = make_point_output(plate_access_out_2,1,PointOutputR_c1)
SpeedConnection_c1 = make_controller('DYNAMIC',1,-1,0,'SpeedConnection@speed')
SpeedConnection_c2 = make_controller('DYNAMIC',1,-1,1,'SpeedConnection@weight')
SpeedConnection = make_connection('SPEED',bow_access_in_2,SpeedConnection_c1,SpeedConnection_c2)
Position_c2 = make_controller('DYNAMIC',1,-1,1,'Position@weight')
Position = make_connection('POSITION',bow_access_in_1,SignalController,Position_c2)
BowConnection_c1 = make_controller('DYNAMIC',3,-1,[4.000000 1.000000 45.000000],'BowConnection@rosin')
BowConnection_c2 = make_controller('DYNAMIC',1,-1,1,'BowConnection@weight')
BowConnection = make_connection('BOW',bow_access_out_1,bow_access_out_2,0.000000,plate_access_in_1,plate_access_in_2,-0.100000,BowConnection_c1,BowConnection_c2)

Thanks for the help!

Hey, still can’t figure out this issue although I have found that the pitch I give to the plate, as well as the amplitude of the sound triggering it has a large effect.

Hi Matthieu,

First sorry for the long delay in replying!
Could you please attach the corresponding patch, so I can test under the same context?
Also, you might want to download the latest release of Modalys.

Best,
Robert

Hey Robert,

Here is an example of a patch I’ve made. In general, Modalys seems to be rather fussy on the audio inputs it receives and how much CPU it uses related to that. Is that a common issue? Both patches here are extracted from larger patches, so it’s just adding an input and output for your system.

Bowed plate: https://www.dropbox.com/s/if6xs59jdse1ulu/bowed_plate.maxpat?dl=0

Four plates: https://www.dropbox.com/s/jve133lgusbyrpa/plates.maxpat?dl=0

Thanks for the help!