Direction 1 (Creative): Create a piece using modulation synthesis

Direction 1 (Creative): Create a piece using modulation synthesis#

In this direction, you will compose a piece of music that showcases the modulation synthesis techniques you’ve been learning: amplitude modulation, frequency modulation, and beyond.

The core idea is to create instruments whose sounds evolve over time by varying modulation parameters. Rather than static timbres, your instruments should use envelopes or other control signals to shape modulation depth, frequency ratios, or other parameters over the course of each note. You will build a multi-part arrangement, design an instrument for each part, render stems, and mix them into a final composition.

You may write an entirely original piece, cover an existing song, draw on material from TheoryTab, or combine approaches. The choice is yours. We encourage you to pursue original compositions that explore what modulation can do, but covering or rearranging existing material is perfectly fine. Computer music does not have to sound like something you’d hear on the radio. You’ll be graded on your technical achievement and how well you realized your creative intent, not on the aesthetics of the result.

Steps#

There is no starter code for this assignment. Structure your implementation however you prefer, as long as it conforms to the requirements below.

  1. Plan your piece. Decide on a concept for your composition. If you’d like to build on existing material, fetch a song from TheoryTab with fetch_theorytab, or find sounds on FreeSound. If composing from scratch, sketch out a structure: how many sections, what instruments, what mood or arc.

  2. Arrange your parts. Build parts: list[pq.Score], with one score per instrument and at least three scores total. This is where your symbolic work happens: writing melodies, constructing chord progressions, designing rhythmic patterns, and structuring sections. If drawing from TheoryTab, you’ll likely need to extend and rearrange the material to reach the required length.

  3. Design a modulation instrument per part. Write one instrument function per part. Each is called as instrument(**event.kwargs), so its parameters must line up with the kwargs of the events in its part. At least one instrument must use envelopes to create time-varying modulation effects, meaning the modulation parameters should change over the course of each note.

  4. Render your stems. Render each part with its instrument to produce stems: list[pq.Audio].

  5. Mix. Combine your stems into a single pq.Audio and write it out as composition.wav. If you’d rather mix in a DAW, export your stems from Python and mix them externally, but the stems themselves must still be produced by your code.

Requirements#

Each requirement is worth the points listed. These 80 points are the manually graded part of your grade. The other 20 come from the Gradescope formatting check.

Requirement

Points

Your composition is between 60 and 300 seconds long, at 44.1kHz or 48kHz. Stereo is preferred but not required.

3

Your code builds a list of at least 3 pq.Score objects representing parts for different instruments.

6

Each part is non-trivial. A part consisting of a single sound event does not count, and neither does a part that is exactly the unmodified melody or harmony returned by TheoryTab.

8

Your code defines a separate instrument function per part, and renders each part with its corresponding instrument to produce one pq.Audio stem per part.

8

At least one instrument uses envelopes to create time-varying modulation effects, meaning the modulation parameters (depth, frequency ratio, index, etc.) change over the course of each note, not just the amplitude.

15

Your stems are mixed into the final composition. Mixing may be done in external audio software, but in that case your code must still export the individual stems.

4

A non-trivial portion of composition.wav is reproduced when your submitted code is re-executed. Using an external DAW is fine, but composing the piece entirely in the DAW and generating only a sound effect in Python is not.

10

You use at least 3 of the techniques listed below, and you name which 3 in CREATIVE.md. Each technique is worth 6 points.

18

Any external audio you use (FreeSound samples, field recordings, etc.) is attributed in CREATIVE.md.

2

CREATIVE.md covers everything listed under Submission below.

6

Total

80

Techniques (choose at least 3):

  • Tremolo. Use amplitude or ring modulation with low frequency (<20Hz) modulators to create tremolo effects. Apply an envelope to the modulation depth so the tremolo fades in or out over the course of a note.

  • Vibrato. Use frequency modulation with low frequency modulators (<20Hz) to create vibrato. Apply an envelope to the modulation depth so the vibrato evolves naturally (e.g., absent during the attack, gradually increasing during the sustain).

  • Data sonification. Use resampled real-world time-series data (e.g., ocean temperatures, stock prices, seismic activity) to control a time-varying modulation parameter such as modulation depth, frequency ratio, or panning.

  • Algorithmic composition. Generate a pq.Score and its per-event parameters (pitch, duration, modulation depth, etc.) using algorithmic techniques, e.g., randomly sampling from a distribution of pitches, or using recursive functions to build hierarchical scores.

  • FM percussion. Use frequency modulation with a high index of modulation and a fast-decaying envelope to synthesize percussive tones like kicks, snares, hi-hats, metallic strikes, or bells.

  • Inharmonic spectra. Use non-integer carrier-to-modulator frequency ratios to produce metallic, bell-like, or other inharmonic timbres that are unique to FM synthesis.

  • Sampled modulation. Use an existing sound (e.g., from FreeSound) as the modulation signal instead of a sinusoid, creating complex timbres derived from real-world audio.

  • Noise modulation. Perform ring modulation on random noise to create breathy, wind-like, or textured tones.

  • Panning modulation. Use sinusoidal modulation to pan audio left and right in a periodic fashion, creating a sense of spatial movement.

  • Cross-modulation. Use the rendered audio from one instrument part as the modulation signal for another part’s synthesis, creating timbral interactions between instruments.

Submission#

Your submission must conform to the creative format. Bundle the following into a single .zip file (under 100MB) and submit it via Gradescope.

  1. composition.wav or composition.mp3: your final composition, 60-300 seconds.

  2. CREATIVE.md: use the open-ended template and leave all ## Section Headings unchanged. Your write-up must state:

    • A description of your piece and the creative intent behind it.

    • Which 3 techniques you chose, how you implemented each one, and where in the piece each one occurs.

    • What your 3+ parts are and which instrument function renders each one.

    • How you used envelopes to create time-varying modulation in at least one instrument.

    • Attribution for any external audio you used.

  3. src/: your Python/Pyquist code plus any sound assets it needs. Anything we can pip install does not need to be included. At minimum this directory should contain something like:

    • composition.ipynb or composition.py: the code that builds your parts, renders your stems, and (if you mixed in Python) produces your composition.

    • Any assets or sound files that your code depends on

Note

The Gradescope autograder only checks the top-level structure of your zip file. It does not verify the specific contents of your src/ directory. Making sure the files above are present, complete, and runnable is up to you.