Sneed synth is a genre of synthesizer music.
Musically, Sneed synth is a work in progress, and artists are welcome and invited to develop the genre.
It is customary to distribute Sneed synth with a permissive license of your choice, with the +NIGGER rider.
This is the first Sneed synth song to ever exist. Enjoy.
Get nyquist, get an editor, and use the following starter code:
;; LICENSE: GPL+NIGGER ;; ;; Nyquist library for Sneed synth creation. ;; Load it in your song creation scripts like so: ;; (load "relpath/to/this/file") (load "reverb") ;;;; Instruments ;;;; ;; Future bass synthesizer. (defun future-bass-note (pitch) (let* ((envelope (env 0.01 0.2 0.1 0.9 0.8 0.8)) (contour (congen envelope 0.01 0.05)) (saw-feedback 0.5) (supersaw (clip (scale 100.0 (sum (fmfb pitch saw-feedback 1.0) (fmfb (+ pitch 0.03) saw-feedback 1.0) (fmfb (- pitch 0.03) saw-feedback 1.0) (fmfb (+ pitch 0.06) saw-feedback 1.0) (fmfb (- pitch 0.06) saw-feedback 1.0) (fmfb (+ pitch 0.12) saw-feedback 1.0) (fmfb (- pitch 0.12) saw-feedback 1.0) (fmfb (+ pitch 0.24) saw-feedback 1.0) (fmfb (- pitch 0.24) saw-feedback 1.0))) 0.9))) (mult (reverb supersaw 0.4) contour))) ;; Wrapper for `bowed'. (defun bowed-note (pitch) (bowed pitch (env 0.01 0.1 0.1 0.9 0.9 0.9))) ;; Wrapper for `flute' (defun flute-note (pitch) (flute pitch (stk-breath-env 1.0 0.1 0.9))) ;;;; Utilities ;;;; (setq sound-duration-max-samples 1000000) ;; Get the duration of a sound. ;; Raise the constant `sound-duration-max-samples' if needed. (defun sound-duration (snd) (abs (apply '- (snd-extent snd sound-duration-max-samples)))) ;; Load Adagio file (sheet music). Returns a `seq'. (defun load-adagio (file) (let ((stream (open file :direction :input)) (s (seq-create))) (seq-read s stream) (close stream) s))
;; LICENSE: GPL+NIGGER ;; ;; SNEED SYNTH TUTORIAL ;; ;; This is a song synthesis script. It specifies what audio to ;; generate, what audio to import, and how to combine it into ;; the final song. ;; ;; Substitute the path here with a relpath to the Sneed library ;; covered previously. It supplies some of the functions used ;; here. (load "./lib/sneed") ;; RENDERING ADAGIO: NOTE BY NOTE ;; Channels are specified in Adagio with the `V
' directive. ;; Here, the channel is used to determine which instrument to use. ;; Add additional instruments in this conditional below. ;; ;; Currently, channel 1 is a bowed instrument (cello, violin, etc.) ;; channel 2 is mandolin ;; channel 3 is flute ;; all other channels are a generic plucked instrument. ;; ;; Feel free to add more channels with different instruments. There ;; is no need to delete these three already here; Adagio supports ;; about 128 voices (channels)! (defun sneed-note (chan pitch) (cond ((= chan 1) (bowed-note pitch)) ((= chan 2) (scale 0.2 (mandolin pitch 1.0))) ((= chan 3) (scale 0.3 (flute-note pitch))) (t (scale 0.2 (pluck pitch))))) (defun sneed-midi (s) (seq-midi s (note (chan pitch velocity) (sneed-note chan pitch)))) (defun sneed (file) (sneed-midi (load-adagio file))) ;; SONG SPECIFICATION ;; Here, we describe the song. ;; We write parts per-instrument, so that we can apply overall ;; effects to just one instrument at a time if we wish. ;; ;; We then mix the parts of one song segment together, in order that ;; trailing rests aren't lost, and sequence the song segments ;; in the end for the final song. ;; ;; The composition of `snd-normalize' and `sum' works well to mix ;; song parts together. ;; ;; `seqrep' repeats a behavior (the result of `cue'; see docs), ;; enabling us to repeat song segments easily. ;; ;; `seq' lays song parts end to end to make the final song. (let* ((bass (sneed "your/adagio/music.adg")) (chords (sneed "your/adagio/music.adg")) (melody (sneed "your/adagio/music.adg")) (segment (snd-normalize (sum bass chords melody))) (final (seq (seqrep (i 4) segment)))) (s-save final)) ;; By default, Nyquist saves to /tmp/$USER-temp.wav
You will compose parts in Adagio, which is more or less sheet music.
Adagio is well-documented in the Nyquist documentation, but here's a chord progression to get you started:
!TEMPO 100 !CLOCK D4 W V1, F4 W V1, A4 W V1 C4 W V1, E4 W V1, G4 W V1 A3 W V1, C4 W V1, E4 W V1 C4 W V1, E4 W V1, G4 W V1
Run the synthesis program (starter code above) with the
ny interpreter, like so:
ny < synthesis.lsp
You must be in the proper directory that the relative paths in your code are valid.
Join the Sneedacity matrix room.