     for fingering, i in fingerings
       cell -> draw_fingerboard(fingering)
 
+draw_pitch_diagram = (pitch_classes, degree_colors) ->
+  r = 10
+  pitch_names = '1 2b 2 3b 3 4 T 5 6b 6 7b 7'.split(/\s/)
+  pitch_names = 'R m2 M2 m3 M3 P4 TT P5 m6 M6 m7 M7'.split(/\s/)
+  pitch_class_angle = (pitch_class) -> (-3 + pitch_class) * 2 * Math.PI / 12
+  for pitch_class, degree_index in pitch_classes
+    a = pitch_class_angle(pitch_class)
+    ctx.beginPath()
+    ctx.moveTo 0, 0
+    ctx.lineTo r * Math.cos(a), r * Math.sin(a)
+    ctx.stroke()
+    ctx.beginPath()
+    ctx.arc r * Math.cos(a), r * Math.sin(a), 2, 0, 2 * Math.PI, false
+    ctx.fillStyle = degree_colors[degree_index]
+    ctx.fill()
+  ctx.font = '4pt Times' if draw_diagrams
+  ctx.fillStyle = 'black'
+  for class_name, pitch_class in pitch_names
+    a = pitch_class_angle(pitch_class)
+    r2 = r + 7
+    m = ctx.measureText(class_name)
+    ctx.fillText class_name, r2 * Math.cos(a) - m.width / 2, r2 * Math.sin(a) + m.emHeightDescent
+
 chord_page = (chord, options) ->
   {best_fingering} = options || {}
 

  {barres} = options
  draw_strings()
  draw_frets()
  if barres and (pos for pos in positions when pos.fret > 0).length >= 4
    fret_rows = for fn in FretNumbers
      (for sn in StringNumbers
        if _.find(positions, (pos)-> pos.string == sn and pos.fret > fn)

  , cell_height: padded_fretboard_height + diagram_gutter
  , header_height: diagram_title_height
  , (cell) ->

    ctx.font = '20px Impact'
    ctx.fillStyle = 'rgb(128, 128, 128)'
    ctx.fillText "#{chord.name} Chords", diagram_gutter / 2, header_height / 2

    ctx.save()
    ctx.translate 205, 20
    ctx.scale 0.85,0.85
    draw_pitch_diagram chord.pitch_classes, degree_colors
    ctx.restore()

    pitches = ((i * 5 + 3) % 12 for i in [0...12])
    for pitch in pitches
