Use the matrix multiplication method of Kalotas and Lee (K&L) to investigate the spectrum of nonuniform strings.

Each nonuniform string is 1 yard long (36”=0.9144 meters). lam% of the string is wrapped and the other (1-lam)% isn’t. The heaver wrapped side (18”) weighs 12.6 grams (0.0275591 kg/m), and the lighter unwrapped side (18”) weighs 3.3 grams (0.00721785 kg/m). Each of the two strings can have any lam value, and the dissonance curve shows the dissonance between the two strings over a bit more than two octaves (so that we can see what happens when either string is “above” the other). This version allows calcultionsi for a range of mu1 and mu2 values.

addSynth[dur_,sr_,freqs_,amps_,decay_]:=Module[{},tVec=Range[0.,dur,1/sr];
env=Exp[-decay*tVec];
envRise=ConstantArray[1,Length[tVec]];
envRise[[1;;8000]]=Range[0,0.9999,1/8000];
env envRise Total[Table[amps[[i]] Sin[2 Pi freqs[[i]] tVec],{i,1,Length[freqs]}]]];ratio2cents[x_]:=(1200 Log[10,x])/Log[10,2];
cents2ratio[x_]:=10^((Log[10,2] x)/1200);
mat[ki_,wi_]:={{Cos[ki wi],-Sin[ki wi]/(ki)},{ki Sin[ki wi],Cos[ki wi]}};
f[ww_,mu1_,mu2_,t_]:=(mat[k1[ww,mu1,t],w1].mat[k2[ww,mu2,t],w2])[[1,2]];
k1[www_,mu_,t_]:=www Sqrt[mu/t];k2[www_,mu_,t_]:=www Sqrt[mu/t];
findSpec100[lam_,mu1_,mu2_]:=Module[{},w1=lam 0.9144;w2=(1-lam)*0.9144;
sol=FindRoot[f[w,mu1,mu2,15]==0,{w,Range[100,highF,10]}];
posSol=Select[sol[[1,2]],#>20&];
posSol100=100 posSol/posSol[[1]];
Select[Union[Round[100*posSol100/100.]],highF>#>0&]];
d[f1_,f2_]:=Exp[-3.5 Abs[f2-f1] s[Min[f1,f2]]]-Exp[-5.75 Abs[f2-f1] s[Min[f1,f2]]];
s[freq_]:=0.22/(0.021 freq+19);
dissAmp[spec1_,spec2_,amp1_,amp2_]:=Total[Table[Min[amp1[[i]],amp2[[j]]] d[spec1[[i]],spec2[[j]]],{i,1,Length[spec1]},{j,1,Length[spec2]}],2];
logSpace[a_,b_,n_]:=2.0^Range[a,b,(b-a)/(n-1)];
highF=2000;
Manipulate[
amp=0.95^Range[numLines];spectrum=4 Take[findSpec100[lam,mu1,mu2],numLines];
alphas=cents2ratio[#]&/@Range[0,range,1]//N;
dissAll=Table[dissAmp[spectrum,alpha spectrum,amp,amp],{alpha,alphas}];
fig=ListLinePlot[Transpose[{ratio2cents[alphas],dissAll}],PlotRange->All,ImageSize->size*600,AxesLabel->{"cents","sensory dissonance"},Ticks->{Automatic,None}];
allMins=ratio2cents@alphas[[First@Transpose@FindPeaks[-dissAll]]];
Column[{EventHandler[fig,{"MouseClicked":>(ptClick=MousePosition["Graphics"];sndWav1=addSynth[1,44100, spectrum1/2,RandomReal[{-1,1},numLines],2];sndWav2=addSynth[1,44100,cents2ratio[First@ptClick] spectrum2/2,RandomReal[{-1,1},numLines],2];
EmitSound@SampledSoundList[sndWav1,44100];
EmitSound@SampledSoundList[sndWav2,44100];
EmitSound@SampledSoundList[sndWav1+sndWav2,44100];)}],Text[allMins]}],
Control[{{lam,0.727,"lambda string"},0,1}],Row[{Control[{{mu1,0.0275591,"density segment 1"},0.001,0.05}],Spacer[10],Control[{{mu2,0.00721785,"density segment 2"},0.001,0.05}]}],Row[{Control[{{numLines,6,"number of spectral lines"},3,10,1}],Spacer[10],Control[{{size,1},{1/2,3/4,1,2,3,4}}],Spacer[10],Control[{{range,1500},{700,1200,1500,1800,2400,2700}}]}],FrameLabel->Dynamic[MousePosition["Graphics"]],SynchronousUpdating->False,SaveDefinitions->True]