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.