-odac
-m0
-d
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Partial Emergence
by Richard Knight 2022
Installation submission for the International Csound Conference 2022
Entry point
TODO:
section 9: overlaps produce dropouts, too many mincers
Apparent memory leak in pvs opcodes
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
sr = 44100
ksmps = 64
nchnls = 2
0dbfs = 4
seed 0
; exit after specified number of seconds
;#define DEBUG_RUNTIME #30#
; use database, otherwise load from include/soundexport.xdb
#define USE_DATABASE ##
; path to sounds
#define SOUND_BASE #sounds/#
; path to progressions; seems to be problematic with base path depending on where Csound is run from
;#define PROGRESSIONPATH #progressions# ;#D:/Documents/Csound/csd-partialemergence/progressions#
#define PROGRESSIONPATH #D:/Documents/Csound/csd-partialemergence/progressions#
; initial progression; macro used by sequencing_melodic_persistence.udo
#define MEL_INITPATH #$PROGRESSIONPATH/progression1.fnmlmel#
; SONICS includes
#ifndef USE_DATABASE ; use export file if database not specified
#include "include/soundexport.xdb"
#end
#include "sonics/sounddb.udo"
#include "sonics/array_tools.udo"
#include "sonics/sequencing.udo"
#include "sonics/sequencing_melodic.udo"
#include "sonics/sequencing_melodic_portamento.udo"
#include "sonics/sequencing_melodic_persistence.udo"
#include "sonics/bussing.udo"
#include "sonics/instrument_sineblips.udo"
; installation specific includes
#include "include/debug.inc"
#include "include/effects_global.inc"
#include "include/instruments_water.inc"
#include "include/instruments_musicbox.inc"
#include "include/instruments_hybrid.inc"
#include "include/instruments_synthesis.inc"
#include "include/sequence_sections.inc"
/*
Sections:
Array index of dimension 1 corresponds to "sequencer_s%d" instrument, where %d is the index
Array index of dimension 2:
0 duration minimum
1 duration maximum
2 follow section A
3 follow section A/B chance ratio (0 = always A, 1 = always B)
4 action section 2
*/
gisections[][] init 16, 5
gisections fillarray\
60, 90, 1, 0.3, 5 ,\ ; 0
60, 90, 2, 0.3, 6 ,\ ; 1 chord music box runs with stretch chords
60, 90, 3, 0.5, 1 ,\ ; 2 bass, single note music box runs
60, 90, 4, 0.2, 0 ,\ ; 3 bass, chord music box runs
60, 90, 5, 0.3, 2 ,\ ; 4
60, 90, 6, 0.3, 8 ,\ ; 5 drop stretch, resonated
60, 90, 7, 0.5, 4 ,\ ; 6 tuned drops, stretch chords
60, 90, 8, 0.7, 0 ,\ ; 7 tuned drops, stretch chords more prominent
60, 90, 0, 0.7, 3 ,\ ; 8 drop stretch
60, 90, 9, 0.5, 9 ,\ ; 9 low portamento chords
60, 90, 10, 0.5, 5 ,\ ; 10 glitch chord
60, 90, 5, 0.5, 4 ,\ ; 11 water drops, low minimal chords, resonated drops, stretch water
60, 90, 13, 0.5, 14,\ ; 12 minimal, reson drops
60, 90, 15, 0.5, 10,\ ; 13 reson drops buildup
60, 90, 9, 0.5, 3,\ ; 14 low drop reson portamento chords
60, 90, 12, 0.5, 11 ; 15 just music box chords
; initial section
ginitsection = 0
; possible melodic progressions which are files in $PROGRESSIONPATH
gSprogressions[] fillarray "progression1.fnmlmel", "progression2.fnmlmel"
gicurrentprogression init 0
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Control instruments
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
Call all performance instruments accordingly
*/
instr boot
gkseq_tempo init 100
SbootInstrs[] fillarray "global_delay1", "global_delay2", "global_reverb1", "audio_output", "sequencer_main", "global_pvsamp1"
index = 0
while (index < lenarray(SbootInstrs)) do
schedule(SbootInstrs[index], 0, -1)
index += 1
od
gimel_portamento_beatratio = 4
turnoff
endin
/*
Master output mastering/processing
*/
instr audio_output
; gkmastervolume
aL, aR bus_read "master"
iexcite = 1
aL += (exciter(aL, 3000, 20000, 10, 10)*iexcite)
aR += (exciter(aR, 3000, 20000, 10, 10)*iexcite)
bus_masterout(aL, aR)
endin
/*
Set random melodic progression
*/
instr set_progression
index = int(random(0, lenarray(gSprogressions)))
; only set if it differs from current
if (index != gicurrentprogression) then
gicurrentprogression = index
Sprogression = gSprogressions[index]
prints sprintf("Progression change: %s\n", Sprogression)
subinstrinit "mel_loadstate_fs", strcat("$PROGRESSIONPATH/", Sprogression)
endif
turnoff
endin
/*
Main section sequencer
*/
instr sequencer_main
; set up initial instrument at init time
initduration = random(gisections[ginitsection][0], gisections[ginitsection][1])
ksection init ginitsection
ksectiontime init initduration
schedule(sprintf("sequencer_s%d", ginitsection), 0, initduration)
prints sprintf("Start: section %d\n", ginitsection)
; react to section changes at k-rate
kabstime timeinsts
klaststarttime init 0
; if current section time is up, schedule next
if (kabstime - klaststarttime >= ksectiontime) then
; determine next section based on follow action threshold
kchance = random:k(0, 1)
if (kchance <= gisections[ksection][3]) then
ksection = gisections[ksection][4]
else
ksection = gisections[ksection][2]
endif
; get duration between specified min and max
ksectiontime = random:k(gisections[ksection][0], gisections[ksection][1])
; schedule section subsequencer and print status
schedulek sprintfk("sequencer_s%d", ksection), 0, ksectiontime
printf "Section %d\n", ksection, ksection
; set a new chord progression if relevant
if (random:k(0, 1) >= 0.5) then
schedulek("set_progression", 0, 1)
endif
if (random:k(0, 1) > 0.5) then
seq_settempo(random:k(20, 100))
endif
klaststarttime = kabstime
endif
endin
f0 z
i"boot" 0.5 1 ; slight delay to account for initial melodic progression load