diff options
author | Richard <q@1bpm.net> | 2025-04-13 18:48:02 +0100 |
---|---|---|
committer | Richard <q@1bpm.net> | 2025-04-13 18:48:02 +0100 |
commit | 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 (patch) | |
tree | 291bd79ce340e67affa755a8a6b4f6a83cce93ea /site/udo/legacy/sequencing_melodic_persistence.udo | |
download | apps.csound.1bpm.net-9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22.tar.gz apps.csound.1bpm.net-9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22.tar.bz2 apps.csound.1bpm.net-9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22.zip |
initial
Diffstat (limited to 'site/udo/legacy/sequencing_melodic_persistence.udo')
-rwxr-xr-x | site/udo/legacy/sequencing_melodic_persistence.udo | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/site/udo/legacy/sequencing_melodic_persistence.udo b/site/udo/legacy/sequencing_melodic_persistence.udo new file mode 100755 index 0000000..dd309af --- /dev/null +++ b/site/udo/legacy/sequencing_melodic_persistence.udo @@ -0,0 +1,246 @@ +#ifndef UDO_MELSEQUENCINGPERSIST_LEGACY
+#define UDO_MELSEQUENCINGPERSIST_LEGACY ##
+/*
+ Melodic sequencer persistence: saving/loading from files and database
+ Legacy: superceded by JSON
+
+ This file is part of the SONICS UDO collection by Richard Knight 2021, 2022
+ License: GPL-2.0-or-later
+ http://1bpm.net
+*/
+
+#include "pgdb.udo"
+#include "sequencing_melodic.udo"
+#include "array_tools.udo"
+#include "interop.udo"
+
+
+
+
+/*
+ Save state to file
+
+ p4 path to save to
+*/
+instr mel_savestate_fs
+ Spath = p4
+ ftsave Spath, 1,\
+ gimel_chords, gimel_notes,
+ gimel_lengths, gimel_action1,\
+ gimel_action2, gimel_actionthreshold,\
+ gimel_active, gimel_importance,\
+ gimel_mod1, gimel_mod2,\
+ gimel_mod3, gimel_mod4,\
+ gimel_state
+ turnoff
+endin
+
+
+/*
+ Load state from file
+
+ p4 path to load from
+*/
+instr mel_loadstate_fs
+ Spath = p4
+ isize = -1
+ iline = 0
+
+/* ; COMMENTED AS readfi IS NOT AVAILABLE ON LIVE COMP?!?!?! - testing if size matches etc
+
+ ; get size from first table
+ while (isize == -1 && iline != -1) do
+ Sline, iline readfi Spath
+ if (strcmp(strsub(Sline, 0, 4), "flen") == 0) then
+ isize = strtod(strsub(Sline, 6, strlen(Sline)-1))
+ isizefound = 1
+ endif
+ od
+
+ ; size not found in file
+ if (isize == -1) then
+ isize = ftlen(gimel_chords)
+
+ ; resize required
+ elseif (isize != ftlen(gimel_chords)) then
+ gimel_number = isize
+ _mel_refreshactions() ; update actions list to cater for number of patterns
+ index = 0
+ while (index < lenarray(gimel_fns)) do
+ ifn = gimel_fns[index]
+ ftfree ifn, 0
+ itemp ftgen 0, 0, -isize, -7, 0
+ index += 1
+ od
+ endif
+*/
+
+ ftload Spath, 1,\
+ gimel_chords, gimel_notes,
+ gimel_lengths, gimel_action1,\
+ gimel_action2, gimel_actionthreshold,\
+ gimel_active, gimel_importance,\
+ gimel_mod1, gimel_mod2,\
+ gimel_mod3, gimel_mod4,\
+ gimel_state
+
+ gkmel_futures_refresh_trig = 1
+ turnoff
+endin
+
+
+
+/*
+ Save state to database
+ mel_savestate_db Sname
+
+ Sname identifier to be used
+*/
+opcode mel_savestate_db, 0, S
+ Sname xin
+ pgdb_table_save Sname, "melseq", gimel_state
+
+ index = 0
+ while (index < lenarray(gimel_fns)) do
+ pgdb_table_save strcat(Sname, strcat("||", gSmel_names[index])), "melseq", gimel_fns[index]
+ index += 1
+ od
+endop
+
+
+
+; broken: underlying pgdb_table_savek not working
+opcode mel_savestate_dbk, k, S
+ Sname xin
+ ilength = lenarray(gimel_fns)
+ ktrigger init 0
+ kcomplete init 0
+ kindex init -1
+
+ if (kindex == -1) then
+ kdone pgdb_table_savek Sname, "melseq", gimel_state, -1
+ else
+ kdone pgdb_table_savek strcatk(Sname, strcatk("||", gSmel_names[kindex])), "melseq", gimel_fns[kindex], ktrigger
+ ktrigger = 0
+ endif
+
+ if (kdone == 1) then
+ if (kindex + 1 < ilength) then
+ kindex += 1
+ ktrigger = 1
+ else
+ kcomplete = 1
+ endif
+ endif
+
+
+ xout kcomplete
+endop
+
+
+; ftresize ?????
+
+/*
+ Load state from database
+ mel_loadstate_db Sname
+
+ Sname identifier to be used
+*/
+opcode mel_loadstate_db, 0, S
+ Sname xin
+ inull pgdb_table_get Sname, "melseq", gimel_state
+ index = 0
+ while (index < lenarray(gimel_fns)) do
+ StestName = sprintf("%s||%s", Sname, gSmel_names[index])
+ inull pgdb_table_get StestName, "melseq", gimel_fns[index]
+ index += 1
+ od
+ gkmel_futures_refresh_trig = 1
+endop
+
+
+
+/*
+ Get an array of the known mel states from database
+ Sdata[] mel_liststates_db
+
+ Sdata[] the state names
+*/
+opcode mel_liststates_db, S[], 0
+ Sresult[][] dbarray gidb, "SELECT distinct (string_to_array(name, '||'))[1] FROM savearray WHERE unit = 'melseq'"
+ ilen = lenarray(Sresult)
+ Sdata[] init ilen
+ index = 0
+ while (index < ilen) do
+ Sdata[index] = Sresult[index][0]
+ index += 1
+ od
+ xout Sdata
+endop
+
+
+; broken
+instr mel_savestate_dbk
+ Sname = p4
+ kdone mel_savestate_dbk Sname
+ if (kdone == 1) then
+ io_sendstring("mel_state_saved", Sname)
+ turnoff
+ endif
+endin
+
+instr mel_savestate_db
+ Sname = p4
+ mel_savestate_db Sname
+ event_i "i", "mel_hostsendstates_db", 0, 1 ; resend list of items
+ if (timeinstk() >= 3) then
+ outvalue "mel_state_saved", Sname
+ turnoff
+ endif
+ ;io_sendstring("mel_state_saved", Sname)
+ ;turnoff
+endin
+
+
+instr mel_loadstate_db
+ Sname = p4
+ mel_loadstate_db Sname
+ event_i "i", "mel_updatehost", 0, 1
+ if (timeinstk() >= 3) then
+ outvalue "mel_state_loaded", Sname
+ turnoff
+ endif
+ ;io_sendstring("mel_state_loaded", Sname)
+ ;turnoff
+endin
+
+instr mel_hostsendstates_db
+ Sjson = sprintf("{\"states\": %s}", arr_serialise(mel_liststates_db()))
+ ;io_sendstring("mel_dbstates", Sjson)
+ ;turnoff
+ if (timeinstk() >= 3) then
+ outvalue "mel_dbstates", Sjson
+ turnoff
+ endif
+endin
+
+
+; if MEL_INITPATH or MEL_INITDB is set, load the specified progression data accordingly
+#ifdef MEL_HASINIT
+instr _mel_persistence_init
+#ifdef MEL_INITPATH
+ subinstrinit "mel_loadstate_fs", "$MEL_INITPATH"
+#end
+#ifdef MEL_INITDB
+ ;mel_loadstate_db "$MEL_INITDB"
+ subinstrinit "mel_loadstate_db", "$MEL_INITDB"
+#end
+ alwayson "_mel_manager"
+ turnoff
+endin
+schedule "_mel_persistence_init", 0, 60
+
+; end MEL_HASINIT
+#end
+
+#end
|