Sneed synth is a genre of synthesizer music.
Sneed synth MUST be made using Nyquist and/or Sneedacity.
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.