 def instruments(self):
    d=self.d;n=d['number'];style=d['style'];slow=style in ['slow','finale'];previous=None
    # Two 4/4 bars make one half-time trap measure. Pitched parts use written
    # country triads, alternating fifths, banjo rolls and pedal-steel answers.
    for bar in range(int(self.end//4)):
      b=bar*4;s=self.section(b);kind=s['kind'];local=int((b-s['beat'])/4)
      root,ch,q=self.harmony(b);hook=kind=='hook';intro=kind=='intro';bridge=kind=='bridge';solo=kind in ['solo','instrumental']
      amp=.52 if intro else .65 if bridge else .55 if kind=='outro' else 1.12 if hook else .88
      sparse=bridge or (intro and local<2)
      if kind!=previous:
       if b>0:
        self.add(b-2,1.95,31,65,.045,bus=2,pan=-.3,reverb=.12)
        self.add(b-.65,.6,32,root+24,.048,pan=.3,delay=.1)
       if hook:self.add(b,1.8,8,74,.12,pan=.5,reverb=.2)
       previous=kind
      # Palm-muted synthetic guitar: bass note then tight upper-string replies.
      for off in ([0,2.5] if not sparse else [0]):
       for j,note in enumerate(ch[:3]):
        self.add(b+off+j*.032,.7 if slow else .32,39,note,.063*amp,pan=-.48+j*.08,color=.42,delay=.025,reverb=.035)
      # Banjo rolls: an eight-note forward/reverse cell, with a high drone.
      rolls=[[0,1,2,1,3,2,1,2],[0,2,1,3,2,0,1,3],[0,1,3,2,1,2,3,1]][n%3]
      if not sparse and (not slow or hook or solo or bar%2==0):
       notes=[ch[0]+12,ch[1]+12,ch[2]+12,d['root']+31]
       step=.5 if style!='rodeo' else .5
       for j in range(8):
        if style=='chrome' and j in [3,6]:continue
        self.add(b+j*step+(0.028 if j%2 else 0),.28,36,notes[rolls[(j+bar%2*2)%8]],(.074 if j%3==0 else .051)*amp,pan=.42,color=.62,reverb=.065,delay=.04)
      elif intro or bridge:
       for j in range(3):self.add(b+j,.48,36,ch[j]+12,.054,pan=.4,reverb=.12)
      # Steel dyads bend into the chord and answer the end of vocal phrases.
      if bar%4==3 or solo or (hook and bar%2==0):
       for j in [0,2]:
        target=ch[j]+12
        self.add(b+.25+j*.07,2.8 if slow else 1.9,37,target-2,.069*amp,pan=-.18+j*.19,endnote=target,expr=.7,reverb=.20,delay=.15)
      if (hook or solo) and bar%2==0:
       for j in range(3):self.add(b+j*.06,7.4,35,ch[j],.012*amp,pan=(j-1)*.65,reverb=.12)
      # Fiddle riffs use major/minor pentatonic turns; only enter in featured songs.
      scale=[0,2,4,7,9,7,4,2] if d['mode']=='major' else [0,3,5,7,10,7,5,3]
      if solo or ((hook or kind=='outro') and style in ['barn','wedding','scarecrow']):
       for j,off in enumerate([0,.75,1.5,2.5,3.25]):
        pitch=d['root']+24+scale[(j+local*2+n)%8]
        self.add(b+off,.60,38,pitch,.074*amp,pan=-.22,color=.5,expr=.6,delay=.075,reverb=.10)
      if style=='chrome' and (hook or solo):
       for j in range(3):self.add(b+j*1.25,1.2,28,ch[j]+12,.024*amp,pan=.6,reverb=.18)
      if style=='finale' and (hook or bridge) and bar%2==0:
       for j in range(3):self.add(b,7.6,29,ch[j],.023,pan=(j-1)*.4,reverb=.19)
      # Sub sits around 37–62 Hz; octave flicks fall into long, saturated slides.
      bassroot=root
      while bassroot>35:bassroot-=12
      while bassroot<27:bassroot+=12
      pattern=[(0,1.65,0),(1.75,.65,0),(3,0.85,7)] if n%3==1 else [(0,2.7,0),(3.25,.6,12)] if n%3==2 else [(0,.9,0),(1.5,1.25,0),(3,.85,7)]
      if bar%2:pattern=[(.5,1.1,0),(2,1.2,0),(3.5,.45,12)]
      if slow:pattern=[(0,3.4,0)] if bar%2==0 else [(1,2.7,7)]
      if not sparse and not (kind=='outro' and local>=2):
       for off,length,interval in pattern:
        end=bassroot if interval==12 else bassroot+interval
        self.add(b+off,length,10,bassroot+interval,.42*amp,color=.85 if hook else .55,expr=4 if off==0 else 0,endnote=end,reverb=0)
      # Snare on beat three; staggered kick clusters and changing hat rolls.
      drums=not sparse and not (kind=='outro' and local>=2)
      if drums:
       kicks=[0,1.5,3.25] if n%3==1 else [0,.75,3.5] if n%3==2 else [0,1.75,2.75]
       if bar%4==3:kicks=[0,1.5]
       if slow:kicks=[0,3.25] if bar%2==0 else [.5]
       # One-bar air pocket before the last hook makes the drop land.
       if hook and local==0:kicks=[0,1.5,3.25]
       for off in kicks:self.add(b+off,.16,0,36,.65*amp,color=.46,expr=.55)
       self.add(b+2,.15,1,50,.36*amp,color=.65,reverb=.045)
       self.add(b+2.012,.17,2,60,.15*amp,pan=.12,reverb=.08)
       for j in range(8):
        if bar%4==3 and j>=6:continue
        off=j*.5+(.036 if j%2 else 0)
        self.add(b+off,.045,3,80,(.073 if j%2==0 else .042)*amp,pan=-.3 if j%2 else .32,reverb=.018)
       if bar%4==3 or (hook and bar%2):
        rollstep=1/6 if bar%8==7 else .125 if hook else .25
        for j in range(round(1/rollstep)):
         self.add(b+3+j*rollstep,.032,3,80,.055*amp*(.72+j*rollstep*.5),pan=-.55+j*rollstep,color=.5,reverb=.01)
       if bar%2==0:self.add(b+3.5,.13,4,80,.082*amp,pan=.45,reverb=.05)
       if style in ['rodeo','barn','wedding']:
        for j in [0,1,2,3]:self.add(b+j,.08,6,51,.053*amp,pan=-.4)
       if bar%8==7:
        for j in range(3):self.add(b+3+j/3,.10,1,50,.07+j*.018,pan=(j-1)*.3,color=.5)
      if intro and local==0:self.add(b,7,9,60,.022,reverb=.03)
