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).

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_,t_]:=(mat[k1[ww,t],w1].mat[k2[ww,t],w2])[[1,2]];
k1[www_,t_]:=www Sqrt[mu1/t];k2[www_,t_]:=www Sqrt[mu2/t];
findSpec100[lam_]:=Module[{},w1=lam 0.9144;w2=(1-lam)*0.9144;
bestT=(FindRoot[f[100,t]==0,{t,15 lam+5}])[[1,2]];
sol=Quiet[FindRoot[f[w,bestT]==0,{w,Range[100,highF,10]}]];
Select[Union[Round[100*sol[[1,2]]]/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;mu1=0.0275591;mu2=0.00721785;lam=1/2;
Manipulate[If[link==True,lam2=lam1;];
amp=0.95^Range[numLines];spectrum1=4 Take[findSpec100[lam1],numLines];
spectrum2=4 Take[findSpec100[lam2],numLines];
alphas=cents2ratio[#]&/@Range[-range,range,5]//N;
dissAll=Table[dissAmp[spectrum1,alpha spectrum2,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]}],
Row[{Control[{{lam1,1/2,"lambda string 1"},0,1}],Spacer[10],Control[{{link,True},{True,False}}]}],Control[{{lam2,1/2,"lambda string 2"},0,1}],Row[{Control[{{numLines,5,"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]