Reading about rotary harmonographs in the *Quadrivium*, it was of course necessary for me to write scheme code to simulate one. This simulates a pen moving circularly in one direction, on a piece of paper moving circularly in the other direction. This, in turn, provides an interesting way to visualize harmonic ratios.

Formulas on the Internet focus on trigonometric functions for x and y axes. But it seems more appealing to deal with this using rotations of complex numbers. This is the basic math:

#lang racket

(require plot)

(define ei (exp 0+1i))

(define (rot ang/tunit t phase)

(expt ei (+ phase (* ang/tunit t))))

(define tau (* 2 pi))

(define (compnums ti samples f1 f2)

(let ([ang0 (/ tau f1)]

[ang1 (/ tau f2)])

(map (lambda (n)

(let ([t (* n ti)])

(+

(rot ang0 t 0)

(rot ang1 t 0))))

(range 0 (- samples 1))))

And we need some interface code to generate the plot:

(define (complex2vec c) (vector (real-part c) (imag-part c)))

(define (rotaryplot ti samples f1 f2)

(plot

(lines

(map

complex2vec

(compnums ti samples f1 f2)))))

Here, we have the basic circle generated by matching frequencies:

Next we do the octave (2:1):

We get quite a different plot if we have the pen turning in the opposite direction of the paper:

And the 4:3 ratio (known as a “Fourth” in music):

This would be more artistic if we introduced some dampening (friction) like in a physical harmonograph, and a small amount of discord. But, it is getting late, and I have to face that day job tomorrow, so that will have to wait for some other evening.