From 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 13 Apr 2025 18:48:02 +0100 Subject: initial --- site/udo/uniqueid.udo | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 site/udo/uniqueid.udo (limited to 'site/udo/uniqueid.udo') diff --git a/site/udo/uniqueid.udo b/site/udo/uniqueid.udo new file mode 100755 index 0000000..68688f8 --- /dev/null +++ b/site/udo/uniqueid.udo @@ -0,0 +1,81 @@ +#ifndef UDO_UNIQUEID +#define UDO_UNIQUEID ## +/* + Unique ID assignments + + This file is part of the SONICS UDO collection by Richard Knight 2021, 2022, 2024 + License: GPL-2.0-or-later + http://1bpm.net +*/ + + +; globals for internal use +giUniqueID = 0 +giUniqueFrac = 0 + + +/* + Get a unique integer ID + + id uniqueid + + id the ID +*/ +opcode uniqueid, i, 0 + id = giUniqueID + if (giUniqueID + 1 >= 99999999) then ; large guard for 32bit + giUniqueID = 0 + else + giUniqueID += 1 + endif + xout id +endop + + +/* + Get a unique decimal/fractional ID + + id uniquefrac + + id the ID +*/ +opcode uniquefrac, i, 0 + id = giUniqueFrac + giUniqueFrac += 0.0000001 ; smallest for 32bit + if (giUniqueFrac >= 1) then + giUniqueFrac = 0 + endif + xout id +endop + + +/* + Get an array of unique fractional instrument numbers given a base instrument number + + instrs[] uniqueinstrnums instrnum, inum + instrs[] uniqueinstrnums Sinstr, inum + + instrs[] array of unique fractional numbers for the instrument number instrnum + Sinstr the base instrument name + instrnum the base instrument number + inum how many references to generate +*/ +opcode uniqueinstrnums, i[], ii + instrnum, inum xin + instrs[] init inum + index = 0 + while (index < inum) do + instrs[index] = instrnum + uniquefrac() + index += 1 + od + xout instrs +endop + +; overload for named instrument +opcode uniqueinstrnums, i[], Si + Sinstr, inum xin + instrs[] uniqueinstrnums nstrnum(Sinstr), inum + xout instrs +endop + +#endif -- cgit v1.2.3