This work begins with projection of a five-dimensional integer lattice onto a 2D plane using the "cut and project" method, producing Penrose-like quasicrystal tilings. The lattice coordinates are then interpreted as exponents of harmonics, connecting the geometric structure of the tiling to just intonation pitch ratios. The resulting tiling is used to generate four note chords in SuperCollider; each tile is defined by four nodes, defining the chord. Different options, selected through global variables at the beginning of tiling.scd, allow for tones in the chord to be on continuously, have an envelope, or passed through a vocoder (with common modulation for the four tones).
A particular tile may be selected using a mouse in a (SuperCollider) window. Alternatively, TouchOsc may be used to send OSC messages to SuperCollider. Use of TouchOsc requires a setup procedure outlined in touchosc_buttons.ipynb.
A 5×5 cyclic permutation matrix is diagonalized; its complex eigenvectors define two orthogonal 2D planes in R⁵. Points of the Z⁵ lattice whose perpendicular-space projections fall inside a convex hull "window" are selected and projected onto the principal plane, forming the quasicrystal tiling. Each rhombus tile vertex corresponds to a rational frequency ratio built from the primes {3, 5, 7, 9, 11}. [Different integer sequences may be selected in tiling.scd.]
As an aside, the notebook hexadicDiamond.ipynb demonstrates that Erv Wilson's Hexadic Diamond may be generated through use of this same projection to the principal plane.
- Python 3.9+
- SuperCollider (for
tiling.scd)
pip install -r requirements.txtThen launch JupyterLab or Jupyter Notebook from the repo root:
jupyter lab| Notebook | Description |
|---|---|
notebooks/penrose5D.ipynb |
Core notebook. Builds the 5D rotation, selects lattice points via convex-hull cut window, constructs the Penrose tiling, and writes the Data/ files used by SuperCollider. |
notebooks/hexadicDiamond.ipynb |
Derives Erv Wilson's Hexadic Diamond from the same 5D projection, annotating projected points with their JI pitch ratios. |
notebooks/HypercubeOnPlane.ipynb |
Symbolic derivation of the eigenvectors using SymPy; verifies the projection geometry. |
- Run
notebooks/penrose5D.ipynbend-to-end. - Three CSV files are written to
Data/:verts_5Dprojection.txt— 2D coordinates of each tile's four cornersindices_5Dprojection.txt— corresponding 5D lattice indicesfaces_5Dprojection.txt— face-direction index (determines tile shape/color)
- Open
tiling.scdin SuperCollider and evaluate the setup block to load these files.
Open tiling.scd in the SuperCollider IDE. Execute blocks as detailed at beginning of file.
The file is organized into named blocks separated by //=== comments:
ji_tiling.py at the repo root contains functions used across multiple notebooks:
basis2D— construct 2D projection matrix from eigenvector pairsubSet— length-n subsets of an iterablein_hull— convex-hull membership testunitVector,polygonDataFunction,nMemberQ— tile construction helpers