├── Classes ├── NTMI.sc ├── Wait.sc └── extDict.sc ├── HelpSource ├── Classes │ └── NTMI.schelp └── Overviews │ ├── NTMI.schelp │ ├── NTMI_inphlux.png │ ├── NTMI_interfaces.png │ ├── NTMI_mainStage.png │ ├── NTMI_mktlinflmix.png │ └── NTMI_soundSlots.png ├── Install_Tips.scd ├── LICENSE ├── NTMI.quark ├── NTMI_AI_sc_setup ├── 00_loadMe.scd ├── 0_globals │ ├── 0_quarks_test.scd │ ├── 1_loadGlobalUtils.scd │ ├── 2_networkConfig.scd │ ├── 5_chantest.scd │ └── ntmi_defaults.scd ├── 0_helloSound.scd ├── 0_setDirs.scd ├── 1_prefs │ └── historical_2bUpdated │ │ ├── 1_prefs.scd │ │ ├── ntmi_prefs_default.scd │ │ ├── ntmi_prefs_headless.scd │ │ ├── ntmi_prefs_raspi_seoul2021.scd │ │ └── ntmi_prefs_username_example.scd ├── 2_process_presets │ ├── 2a_bufferLoader.scd │ ├── 2b_liveInput.scd │ ├── 2c_loadProcesses.scd │ ├── 2d_preset_func.scd │ └── 2e_presetPilot.scd ├── 3_interfaces │ ├── 0a_inphlux.scd │ ├── 0b_influxWeightz.scd │ ├── 0c_influxZOOM_modes.scd │ ├── 1_slotmachine.scd │ ├── 2_volSteps.scd │ ├── 3_detect_nUFO.scd │ ├── 4_RandomOrbit_clavier.scd │ ├── 5_keyplayer_presez.scd │ ├── 5b_RandomOrbit_switcher.scd │ ├── 6_EndlessEncoders.scd │ ├── 6_TryLoad_MKtls.scd │ ├── 7_oscar.scd │ ├── 8_xflux.scd │ └── optionals │ │ ├── dual_ana_3_2.scd │ │ ├── dual_ana_4.scd │ │ ├── ec4.scd │ │ ├── en16.scd │ │ ├── ferrari.scd │ │ ├── flatcat.scd │ │ ├── flatcat │ │ ├── 0_flatcat_detect.scd │ │ ├── 1_flatcat_NTMI_advanced.scd │ │ ├── 2_flatcat2_gui.scd │ │ ├── 3_flatcat3_trigchange.scd │ │ ├── 4_flatcat4_viz.scd │ │ ├── 5_flatcat5_fwdSend.scd │ │ ├── README_flatcat_ntmi.txt │ │ ├── flatCAT2NTMI_basic.scd │ │ ├── flatCAT_startupFile.scd │ │ └── flatcat.desc.scd │ │ ├── kraken.scd │ │ ├── mu8.scd │ │ ├── nUFO.scd │ │ ├── nUFO │ │ ├── 1a_nUFO.desc.scd │ │ ├── 1a_osc_nUFO.scd │ │ ├── 1b_ntmi_nUFO.scd │ │ ├── 1c_allLEDs_nUFO.scd │ │ ├── 1c_nUFO_imupad_abs.scd │ │ ├── 1e_nUFO_modes.scd │ │ ├── 1f_nUFO_relative.scd │ │ ├── 1h_nUFO_calib_bat.scd │ │ ├── 1i_pads2bits_nUFO.scd │ │ └── 1z_settingsExamples.scd │ │ ├── nanoKtl.scd │ │ ├── nanoKtl1.scd │ │ ├── nu_fo_Sim.scd │ │ ├── shbobo_shnth.scd │ │ ├── uc4.scd │ │ ├── webMouse.scd │ │ └── xtm.scd ├── 6_MainFX.scd ├── 8_GUIs │ ├── 0_generals.scd │ ├── 1_butz.scd │ ├── 2_inphluxgui.scd │ ├── 3_4wins.scd │ ├── 5_presetWin.scd │ ├── 5_randOrbKeyPlayer.scd │ ├── 6_mainFXPresets.scd │ ├── 7_InfluxMixer.scd │ ├── 8_mainstage_adc.scd │ ├── 8b_raspiGui.scd │ ├── 9_chanTestGui.scd │ ├── subsParts │ │ ├── bigUV.scd │ │ ├── clock.scd │ │ ├── imuUV.scd │ │ ├── mainFXBut.scd │ │ ├── mainVol.scd │ │ ├── meter.scd │ │ ├── nUFOInfo.scd │ │ ├── recButs.scd │ │ ├── slotGuis.scd │ │ └── stetho.scd │ └── warnWin.scd ├── 9_demos │ ├── 9_ntmi_general.scd │ ├── 9a_ntmi_GUI.scd │ └── 9b_nanoKtl_demo.scd ├── HOW_TO_PERSONALIZE │ ├── 1_Configure_setup.scd │ ├── 2_adding_presets.scd │ ├── 3a_userDir_POOL.scd │ ├── 3b_adding_sound_processes.scd │ ├── 4a_Connecting_interfaces.scd │ ├── 4b_Add_interface_joystick.scd │ ├── 4c_addInterface_xtouch_mini.scd │ ├── 5_Adding_soundfiles.scd │ ├── All_Interface_Functions.scd │ └── howto_make_saySoundfiles.scd ├── POOL │ ├── 1_server_setups │ │ ├── serverBasic2.scd │ │ └── serverBasic8.scd │ ├── 2_process │ │ ├── allArm.scd │ │ ├── backupsORIGs │ │ │ ├── allArm_ORIG.scd │ │ │ ├── bleepoORIG.scd │ │ │ ├── formSingOriG.scd │ │ │ ├── kiteHiORIG.scd │ │ │ ├── moogSingORIG.scd │ │ │ └── rjkChaosORIG.scd │ │ ├── beatX.scd │ │ ├── bleepo.scd │ │ ├── blippoo.scd │ │ ├── brushes.scd │ │ ├── bufRd.scd │ │ ├── cat.scd │ │ ├── dog.scd │ │ ├── dynstosyn.scd │ │ ├── envelo.scd │ │ ├── filterFB.scd │ │ ├── formSing.scd │ │ ├── frya.scd │ │ ├── gendhy.scd │ │ ├── gendy1.scd │ │ ├── gendy2.scd │ │ ├── gendyfyre.scd │ │ ├── granbuf.scd │ │ ├── kiteHi.scd │ │ ├── lincong.scd │ │ ├── moogSing.scd │ │ ├── nerve1.scd │ │ ├── presets │ │ │ ├── allArm.pxpreset.scd │ │ │ ├── beatX.pxpreset.scd │ │ │ ├── bleepo.pxpreset.scd │ │ │ ├── blippoo.pxpreset.scd │ │ │ ├── brushes.pxpreset.scd │ │ │ ├── bufRd.pxpreset.scd │ │ │ ├── cat.pxpreset.scd │ │ │ ├── dog.pxpreset.scd │ │ │ ├── dynstosyn.pxpreset.scd │ │ │ ├── envelo.pxpreset.scd │ │ │ ├── envelo.pxpreset_BK.scd │ │ │ ├── formSing.pxpreset.scd │ │ │ ├── frya.pxpreset.scd │ │ │ ├── gendhy.pxpreset.scd │ │ │ ├── gendy1.pxpreset.scd │ │ │ ├── gendy2.pxpreset.scd │ │ │ ├── gendyfyre.pxpreset.scd │ │ │ ├── granbuf.pxpreset.scd │ │ │ ├── kiteHi.pxpreset.scd │ │ │ ├── lincong.pxpreset.scd │ │ │ ├── micDelay.pxpreset.scd │ │ │ ├── moogSing.pxpreset.scd │ │ │ ├── nerve1.pxpreset.scd │ │ │ ├── pulselet.pxpreset.scd │ │ │ ├── revFB.pxpreset.scd │ │ │ ├── rjkChaos.pxpreset.scd │ │ │ ├── robTron.pxpreset.scd │ │ │ ├── varsawFB.pxpreset.scd │ │ │ ├── vowel.pxpreset.scd │ │ │ ├── wsetta.pxpreset.scd │ │ │ ├── xFMSH.pxpreset.scd │ │ │ ├── xf-bufFun.pxpreset.scd │ │ │ ├── xf-ringMod.pxpreset.scd │ │ │ └── z_BK │ │ │ │ ├── allArm.pxpreset_BK.scd │ │ │ │ ├── bleepo.pxpreset_BK.scd │ │ │ │ ├── cat.pxpreset_BK.scd │ │ │ │ ├── envelo.pxpreset_BK.scd │ │ │ │ ├── frya.pxpreset_BK.scd │ │ │ │ ├── kiteHi.pxpreset_BK.scd │ │ │ │ ├── micDelay.pxpreset_BK.scd │ │ │ │ ├── moogSing.pxpreset_BK.scd │ │ │ │ ├── revFB.pxpreset_BK.scd │ │ │ │ ├── rjkChaos.pxpreset_BK.scd │ │ │ │ └── robTron.pxpreset_BK.scd │ │ ├── pulsardojo.scd │ │ ├── pulselet.scd │ │ ├── revFB.scd │ │ ├── rjkChaos.scd │ │ ├── robTron.scd │ │ ├── torus.scd │ │ ├── unused │ │ │ ├── etude.scd │ │ │ ├── gendy3.scd │ │ │ ├── tdefNdef.scd │ │ │ └── xf-jetSet.scd │ │ ├── varsawFB.scd │ │ ├── vowel.scd │ │ ├── wsetta.scd │ │ ├── xFMSH.scd │ │ ├── xf-bufFun.scd │ │ └── xf-ringMod.scd │ ├── 2_process_setups │ │ └── basicAllProcessSetup.scd │ ├── 4_effects │ │ └── allFX.scd │ ├── 5_full_setups │ │ └── allProcesses.scd │ ├── example_startup_files │ │ ├── NTMI_AbsRel_workshop.scd │ │ ├── NTMI_basic_desktop.scd │ │ ├── NTMI_flat_krak_auto.scd │ │ ├── NTMI_flatcat.scd │ │ └── NTMI_patchbox.scd │ └── ntmi_settings.scd ├── SpecialUses │ └── load_ntmiPilot.scd ├── __README_NTMI_projdir.md ├── forwarding │ ├── forwarding_NTMI.scd │ ├── forwarding_influx.scd │ └── forwarding_nUFO.scd ├── macos_binaries │ └── tongsengmod ├── soundfiles │ └── examples │ │ ├── Fiona_N_T_M_I.aif │ │ ├── Fiona_nUFO.aif │ │ ├── Oliver_N_T_M_I.aif │ │ ├── Samantha_Airborne_Instruments.aif │ │ ├── Serena_Airborne_Instruments.aif │ │ └── Serena_nUFO.aif └── tests │ └── screenSize_guiTest.scd ├── Platforms └── Raspberry │ ├── 90-hidraw-permissions.rules │ ├── HIDperm_raspi.txt │ └── HowToSetupOnRaspi.txt ├── README.md └── Work ├── Lab ├── influxCombteeth.scd ├── ledCollective.scd └── ledCollectives.scd ├── Optionals ├── 3_MTP_asNTMIPads.scd ├── 8c_touchOSCsimple1_2.scd ├── Ferrari_instructions.txt ├── measureFrameRate.scd ├── midimix.scd ├── warnWin.scd └── xoscSim.scd ├── Sketches ├── LayoutTestsAgain.scd ├── MFdef_Gui.scd ├── checkForRaspiScreen.scd ├── dev_tests │ ├── __rangeTests_xosc.scd │ ├── maingui_loadtests.scd │ └── xosc_minmaxes.scd ├── shifting_buttons.scd ├── storage_folder_format.txt ├── timeMktl.scd ├── weights_asBWGrid2.scd └── weights_tests.scd ├── Tests ├── Tests.scd ├── capMeasure.scd └── test_channels.scd ├── unused ├── 2a_weights_asBWGrid.scd ├── 5_analogToInflux.scd ├── 8_gamepad.scd_BK ├── 8_mainstage4.scd ├── 9_Fx_MasterBACKUP.scd ├── VoiceFX.scd └── ndef-menu-choice.scd └── xosc_backup ├── 2_xosc_pullup.scd ├── 4_xoscgui.scd ├── 5_analogToInflux.scd ├── 6_influxZOOM_in_out.scd ├── xosc-ntmi.desc.scd ├── xoscSim.scd └── xosc_ballet.scd /Classes/NTMI.sc: -------------------------------------------------------------------------------- 1 | /* 2 | // add a method: dict refers to NTI.q, then args 3 | NTMI.boing = { |dict, a, b, c, d| 4 | "boing: ".post; [a, b, c, d].postln; 5 | }; 6 | 7 | // test 8 | NTMI.boing(1, 2, 3, 4); 9 | 10 | NTMI.run 11 | */ 12 | 13 | // flexible project class, redirects everything to internal dict: 14 | NTMI { 15 | classvar time, <>dt, <>countDown, <>checkFunc, <>doPost = false, <>label = \anon; 49 | 50 | *new { |time, dt = 0.1, countDown = 10, checkFunc, doPost, label| 51 | ^super.newCopyArgs(time, dt, countDown, checkFunc, doPost, label); 52 | } 53 | 54 | wait { 55 | var offgrid = 0, i = 0; 56 | var check; 57 | 58 | this.postInfo("starts"); 59 | while { 60 | check = checkFunc.value; 61 | offgrid = time % dt; 62 | // align with dt-grid first 63 | if (offgrid > 0) { offgrid.wait }; 64 | time > 0.0001 and: (check != true) 65 | } { 66 | i = i + 1; 67 | dt.wait; 68 | time = time - dt; 69 | if (i % countDown == 0) { 70 | this.postInfo(time.round(0.01).cs + "secs to go"); 71 | } 72 | }; 73 | this.postInfo("done."); 74 | } 75 | 76 | postInfo { |str| 77 | if (doPost) { "Wait %: %\n".postf(label, str) } 78 | } 79 | } 80 | 81 | -------------------------------------------------------------------------------- /Classes/extDict.sc: -------------------------------------------------------------------------------- 1 | /* 2 | this is for improving Object Modeling style. 3 | 4 | ~dict = (blink: { |dict, testarg| }, blank: { }, blonk: (boing: { |dict, bongo| }), klong: 123 ); 5 | 6 | ~dict.skeys.cs; 7 | ~dict.printSKeys; 8 | 9 | ~dict.printInterface("~dict.", 0); 10 | ~dict.printInterface("~dict.", 1); 11 | 12 | NTMI.printInterface("NTMI.", 0); 13 | 14 | ToDo: 15 | support keys that do begin with a lowercase letter, 16 | (7: [1, 2, 3]) 17 | should become: 18 | dict[7], not dict.7 19 | */ 20 | 21 | + Dictionary { 22 | skeys { 23 | var keys = this.keys(Array); 24 | try { keys.sort }; 25 | ^keys 26 | } 27 | printSKeys { |prefix = ""| 28 | ^this.skeys.do { |key| 29 | (prefix ++ key.cs).postln; 30 | } 31 | } 32 | 33 | printInterface { | prefix = "dict.", maxLevel = 2 | 34 | this.skeys.do { |key| 35 | var codeStr = (prefix ++ key); 36 | var val = this.at(key); 37 | var arglist, argNames; 38 | 39 | case { val.isKindOf(Function) } { 40 | arglist = ""; 41 | argNames = (val.def.argNames ? []).drop(1); 42 | 43 | if (argNames.size > 0) { 44 | arglist = "(" ++ argNames.collect { |name| 45 | name.asString ++ ": ," 46 | }.join(" ").drop(-1) + ")"; 47 | }; 48 | codeStr = codeStr ++ ".value" ++ arglist ++ ";" 49 | }; 50 | (codeStr + "//" + val.class).postln; 51 | 52 | // recur if Dictionary: 53 | if (val.isKindOf(Dictionary) and: (maxLevel > 0)) { 54 | val.printInterface(" " ++ codeStr ++ ".", maxLevel - 1); 55 | } 56 | } 57 | } 58 | } 59 | 60 | -------------------------------------------------------------------------------- /HelpSource/Classes/NTMI.schelp: -------------------------------------------------------------------------------- 1 | TITLE:: NTMI 2 | summary:: Class for the NTMI project quark 3 | categories:: Utility 4 | related:: Overviews/NTMI, Overviews/Modality, Overviews/JITLib, Overviews/JITLibExtensions 5 | 6 | DESCRIPTION:: 7 | 8 | NTMI is a container for a full NTMI project. 9 | It uses a dictionary q to store its full state dynamically. 10 | Its main method is code:: NTMI:run ::, which runs the setup load script 11 | for NTMI as configured. 12 | 13 | First code examples: 14 | 15 | code:: 16 | // load the NTMI setup 17 | NTMI.run; 18 | 19 | // when NTMI setup has run, these objects are stored in NTMI.q: 20 | NTMI.q 21 | 22 | // under these keys: 23 | NTMI.keys(Array).sort 24 | // you can also access them directly from NTMI: 25 | NTMI.q.numChans 26 | NTMI.numChans 27 | 28 | // some are functions: 29 | NTMI.q.select(_.isFunction); 30 | // which you can use like methods: 31 | NTMI.setZoom(0.5); 32 | NTMI.warnWin("test warnwin..."); 33 | 34 | // some are dictionaries for major parts of the setup 35 | NTMI.q.select(_.isKindOf(Event)).keys; 36 | // which may again contain objects and functions 37 | NTMI.slots; 38 | 39 | // to add a new function with arguments, use dict as first arg: 40 | NTMI.myTestFunc = { |dict, obj1, obj2| 41 | "NTMI.myTestFunc:".postln; 42 | "obj1 is %\n".postf(obj1); 43 | "obj2 is %\n".postf(obj2); 44 | }; 45 | NTMI.myTestFunc; 46 | NTMI.myTestFunc(\abc, [1, 2, 3]); 47 | :: 48 | 49 | CLASSMETHODS:: 50 | 51 | METHOD:: initClass 52 | initialize inner dictionary q for all of NTMIs 53 | inner state, i.e. its variables and functions. 54 | 55 | METHOD:: q 56 | access the inner dictionary. 57 | 58 | METHOD:: doesNotUnderstand 59 | Like dictionaries, NTMI redirects any methods it does not 60 | understand to its stored objects, in the dictionary q). 61 | This allows dynamically adding and getting state by name. 62 | 63 | INSTANCEMETHODS:: 64 | none, because NTMI is class-only. 65 | -------------------------------------------------------------------------------- /HelpSource/Overviews/NTMI_inphlux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/HelpSource/Overviews/NTMI_inphlux.png -------------------------------------------------------------------------------- /HelpSource/Overviews/NTMI_interfaces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/HelpSource/Overviews/NTMI_interfaces.png -------------------------------------------------------------------------------- /HelpSource/Overviews/NTMI_mainStage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/HelpSource/Overviews/NTMI_mainStage.png -------------------------------------------------------------------------------- /HelpSource/Overviews/NTMI_mktlinflmix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/HelpSource/Overviews/NTMI_mktlinflmix.png -------------------------------------------------------------------------------- /HelpSource/Overviews/NTMI_soundSlots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/HelpSource/Overviews/NTMI_soundSlots.png -------------------------------------------------------------------------------- /Install_Tips.scd: -------------------------------------------------------------------------------- 1 | // Useful Things you might need to do when installing: 2 | 3 | 4 | // On Windows, when you cannot install quarks, \ 5 | // you may need to install the git software from here: 6 | "https://git-scm.com".openOS; 7 | // and reboot before you can use it! 8 | 9 | 10 | // Install NTMI if you havent yet 11 | Quarks.install("NTMI"); 12 | 13 | // if you have an older version installed, update it: 14 | Quark("NTMI").update; 15 | 16 | // these are the other quarks NTMI needs to have installed: 17 | Quark("NTMI").dependencies.collect(_.name).postln; 18 | 19 | // make sure you have them all 20 | Quark("NTMI").dependencies.do(_.install); 21 | 22 | // make sure you have the latest versions 23 | Quark("NTMI").dependencies.do(_.update); 24 | 25 | 26 | // if you want to use networked xflux, 27 | // make sure you have latest HyperDisCo installed 28 | Quark("HyperDisCo").install; 29 | Quark("HyperDisCo").update; 30 | 31 | 32 | // For using HID devices, such as gamepads, 33 | // on linux, including raspberry Pi, 34 | // you need to give HID devices the proper rights. 35 | 36 | ### In the Terminal, create a file with rules that enable HID gamepads 37 | ### with the nano text editor: 38 | sudo nano /etc/udev/rules.d/99-hid.rules 39 | 40 | ### put this line in the file: 41 | KERNEL=="hidraw*", SUBSYSTEM=="hidraw", OWNER="root", GROUP="plugdev", MODE="0660" 42 | 43 | ### and save with control-o, cntrol-x 44 | 45 | ### to make it work immediately, do 46 | sudo udevadm trigger 47 | 48 | 49 | 50 | // -------------------------------------------------------------------------------- /NTMI.quark: -------------------------------------------------------------------------------- 1 | ( 2 | \name: "NTMI", 3 | \path: "NTMI", 4 | \summary: "setup for the Nontrivial Musical Instrument, a.k.a. nUFO.", 5 | \author: "Alberto de Campo, Hannes Hoelzl, Bruno Gola, Isak Han", 6 | \version: 0.1, 7 | \organization: "Airborne Instruments / aiberlin", 8 | \url: "http://airborneinstruments.eu/", 9 | \since: "2018", 10 | \dependencies: [ 11 | "JITLibExtensions", "adclib", "Influx", "Modality-toolkit", 12 | "Vowel", "KeyPlayer", "KtlLoop", 13 | "https://github.com/musikinformatik/WavesetsEvent", 14 | "StartupFile", "SafetyNet", 15 | "HyperDisCo" 16 | ] 17 | ) 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/0_globals/0_quarks_test.scd: -------------------------------------------------------------------------------- 1 | 2 | var requiredQuarks, installedQuarks, missingQuarks; 3 | 4 | "".postln; 5 | 6 | if (Platform.userAppSupportDir.endsWith("SuperCollider")) { 7 | requiredQuarks = [ 8 | "JITLibExtensions", 9 | "adclib", 10 | "Influx", 11 | "Modality-toolkit", 12 | "Vowel", 13 | /////// GUI based - mayb unneeded in raspis 14 | "KtlLoop", 15 | "KeyPlayer", 16 | // "MultiTouchPad", // macOS only, so not required 17 | // "Standalone", // in Standalones only 18 | ].collect(_.asSymbol); 19 | 20 | installedQuarks = Quarks.installed.collect { |qu| qu.name.asSymbol }; 21 | 22 | missingQuarks = requiredQuarks.difference(installedQuarks); 23 | if (missingQuarks.notEmpty) { 24 | "*** NTMI project folder cannot load - install missing quarks first: ".post; 25 | missingQuarks.postcs; 26 | "*** STOPPING HERE!".postln; 27 | this.halt; 28 | }; 29 | 30 | "... all needed quarks present HERE!".postln; 31 | 32 | } { 33 | // standalone app versions should have all quarks installed - 34 | [ 35 | // [ \Plinkyplonk, "NopeyDopey" ], /// test 36 | [ \NdefPreset, "JITLibExtensions" ], 37 | [ \MFdef, "adclib" ], 38 | [ \Influx, "Influx" ], 39 | [ \KtlLoop, "KtlLoop" ], 40 | [ \MKtl, "Modality-toolkit" ], 41 | [ \Vowel, "Vowel" ], 42 | ].do { |pair| 43 | if (pair[0].asClass.isNil) { 44 | "*** Quark '%' seems to be missing! \n please install it somehow ... *** \n\n".postf(pair[1]) 45 | } 46 | }; 47 | } 48 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/0_globals/2_networkConfig.scd: -------------------------------------------------------------------------------- 1 | 2 | 3 | // "\n********** Network Config: **********\n".postln; 4 | 5 | q.getWifiName = { 6 | // osx only for now: 7 | Platform.case(\osx, { 8 | "networksetup -getairportnetwork en0".unixCmdGetStdOut.split($:).last.drop(1).drop(-1); 9 | }, { 10 | // to be written for win and linux 11 | ""; 12 | }); 13 | }; 14 | 15 | SkipJack({ q.wifiStr = "WiFi:" + q.getWifiName }, 5); 16 | 17 | // todo: adapt for linux and windows later 18 | Platform.case(\osx, { 19 | q.getMyIPs = { 20 | var confstr = unixCmdGetStdOut("ifconfig"); 21 | var labelStarts = confstr.findAll("inet"); 22 | var strings = labelStarts.collect { |start| 23 | confstr.copyRange(start + 5, start + 5 + 20) }; 24 | var cands = strings.collect { |str| 25 | str.split($ ).select { |st| st.size > 7 } 26 | }.flatten(1); 27 | cands.select(_.every("1234567890.".includes(_))); 28 | }; 29 | 30 | // q.getMyIPs; 31 | }); 32 | 33 | // q.myIPs = OSCMon.getMyIPs; 34 | NetAddr.broadcastFlag_(true); 35 | // if (NetAddr.langPort != 57120) { 36 | // q.warnWin( 37 | // "NetAddr.langPort should be 57120, but it is %!".format(NetAddr.langPort) 38 | // ++ "\nBetter reboot SC.", 39 | // "NetAddr.langPort is wrong!"); 40 | // }; 41 | 42 | q.broad = NetAddr("255.255.255.255", NetAddr.langPort); 43 | 44 | // "network setup : \n" 45 | // "IP addresses : % \n".postf(q.myIPs); 46 | "NetAddr.langPort : % \n".postf(NetAddr.langPort); 47 | // "q.broad : % \n".postf(q.broad); 48 | // "\n********************\n".postln; 49 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/0_globals/5_chantest.scd: -------------------------------------------------------------------------------- 1 | /**** chanTest 2 | 3 | to check output channels on a speaker setup, use: 4 | - switchable PinkNoise out to first 8 channels 5 | - loop over the 8 chans, task for auto-run 6 | 7 | q.prefs.active.keys 8 | 9 | ************/ 10 | 11 | q.chantest = (); 12 | Ndef(\pink, { |amp = 0.25, pan = -1| 13 | Pan2.ar(PinkNoise.ar(amp), pan) 14 | }); 15 | 16 | q.chantest.pink = Ndef(\pink); 17 | Ndef.dictFor(s).envir.removeAt(\pink); 18 | 19 | /* 20 | q.chantest.pink.play(0); 21 | q.chantest.pink.play(1); 22 | */ 23 | 24 | q.chantest.task = TaskProxy(); 25 | q.chantest.task.source = { |envir| 26 | loop { 27 | (0..envir.max).do { |i| 28 | envir.dt.wait; 29 | "PINK outchan: ".post; 30 | q.chantest.pink.play(i.postln); 31 | defer { try { 32 | 33 | q.chantest.butz.do {|but, buti| 34 | var butval = (i == buti).binaryValue; 35 | but.value_(butval); 36 | } 37 | } } 38 | } 39 | } 40 | }; 41 | 42 | q.chantest.task.addSpec(\dt, [0.25, 5, \exp, 0.05]); 43 | q.chantest.task.set(\dt, 1); 44 | 45 | q.chantest.task.addSpec(\max, [1, 7, \lin, 1]); 46 | q.chantest.task.set(\dt, 1); 47 | q.chantest.task.set(\max, 7); 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/0_helloSound.scd: -------------------------------------------------------------------------------- 1 | // if NTMI.helloSnd is not already defined in startup file, do this: 2 | fork { 3 | NTMI.numChans.do { |i| 4 | { LFDNoise3.ar( 5 | XLine.kr( 6 | exprand(2000, 5000), 7 | exprand(2000, 20000), 8 | 0.25, doneAction: 2), 9 | 0.1 10 | ) 11 | }.play(outbus: i); 12 | 0.25.wait; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/1_prefs/historical_2bUpdated/1_prefs.scd: -------------------------------------------------------------------------------- 1 | ///// handle default preferences and user preferences 2 | 3 | /* 4 | // read current settings from user prefs: 5 | // this copies the default prefs to user home dir if not there 6 | NTMI.prefs.readUser; 7 | 8 | // open user prefs: 9 | NTMI.prefs.open; 10 | 11 | */ 12 | 13 | NTMI.prefs = NTMI.prefs ? (); 14 | NTMI.prefs.defaultPath = "ntmi_prefs_default.scd".resolveRelative; 15 | ////// multiple example prefs with app? 16 | // NTMI.prefs.found = "ntmi_prefs_*".resolveRelative.pathMatch; 17 | NTMI.prefs.default = NTMI.prefs.defaultPath.load; 18 | NTMI.prefs.userPrefPath = (NTMI.dir.user +/+ "ntmi_prefs.scd"); 19 | 20 | NTMI.prefs.open = { NTMI.prefs.userPrefPath.openOS }; 21 | 22 | [ "setupExample1.scd" ].do { |file| 23 | var pathInQuarkDir = NTMI.dir.setup +/+ "1_prefs" +/+ file; 24 | var pathInUserDir = NTMI.dir.user +/+ file; 25 | if (File.exists(pathInUserDir).not) { 26 | unixCmd( 27 | ("cp" + quote(pathInQuarkDir) + quote(pathInUserDir) 28 | ) 29 | ) 30 | } 31 | }; 32 | 33 | NTMI.prefs.readUser = { 34 | var prefdict; 35 | // try to read user prefs 36 | if (File.exists(NTMI.prefs.userPrefPath)) { 37 | prefdict = NTMI.prefs.userPrefPath.load; 38 | NTMI.prefs.fromUser = prefdict; 39 | "... found user prefs ... ".postln; 40 | // prefdict.postcs; 41 | } { 42 | "copying default prefs to user dir: ".postln; 43 | unixCmd( 44 | ("cp" + quote(NTMI.prefs.defaultPath) + quote(NTMI.prefs.userPrefPath).postcs 45 | ) 46 | ); 47 | } 48 | }; 49 | 50 | NTMI.prefs.readUser; 51 | 52 | // set 53 | NTMI.prefs.active = NTMI.prefs.fromUser ? NTMI.prefs.default; 54 | 55 | ""; 56 | 57 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/1_prefs/historical_2bUpdated/ntmi_prefs_headless.scd: -------------------------------------------------------------------------------- 1 | /* this is the default ntmi prefs file 2 | - you can modify it as you like! 3 | */ 4 | 5 | ( 6 | 'name': 'raspi', // <- user name here 7 | 'numChans': 2, 8 | 'serverSetup': "serverBasic2.scd", 9 | 'hasGui': false, 10 | 11 | // the 4 sounds to load into the slots 12 | 'defaultActives': [ 'allArm', 'dog', 'cat', 'revFB' ], 13 | 14 | influxPresets: [ 3, 12, 37, 42, 45, 86, \diagL ], 15 | // the preset key/name to set it to 16 | influxPreset: 3, 17 | 18 | // these are just filenames with collections of funcs for now 19 | effects: [ "allFX.scd" ], 20 | 21 | // the slotNames to put into q.mFX 22 | mfxSlotNames: [ 23 | '00_in', '0OnePolBal', '0_DBComp', '0_comp', '0_gate', '0freqBal', 24 | '1comby', '1holz', '1ixiDist', 25 | '3AdCVerb', '3ring', '3thrasher', 26 | '4ixiVerb', '5HPF', '5LPF', 27 | '6roto', '7Delay', 28 | '9endFilt', '9monofy', '9stereofy', 29 | 'ampFin' ] 30 | ) 31 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/1_prefs/historical_2bUpdated/ntmi_prefs_raspi_seoul2021.scd: -------------------------------------------------------------------------------- 1 | /* 2 | This is the prefs file for the korea exhibition 2021: 3 | - different raspis known by name load different ndefs on startup. 4 | 5 | */ 6 | 7 | 8 | 9 | q.userName = unixCmdGetStdOut("whoami").select(_.isAlphaNum).asSymbol; 10 | q.hostName = { 11 | Platform.case(\osx, { 12 | unixCmdGetStdOut("hostname").split($-).first.select(_.isAlphaNum).asSymbol; 13 | }, 14 | // works on raspi, hope on linux and windows too? 15 | { 16 | unixCmdGetStdOut("hostname").select(_.isAlphaNum).asSymbol; 17 | }); 18 | }; 19 | 20 | q.startNdefs = ( 21 | adcpi64: [ 'bleepo', 'pulselet', 'rjkChaos', 'revFB', ], 22 | adc: [ 'bleepo', 'pulselet', 'rjkChaos', 'revFB', ], 23 | ntmpi_01: [ 'allArm', 'granbuf', 'moogSing', 'xFMSH', ], 24 | ntmpi_02: [ 'bleepo', 'pulselet', 'robTron', 'xf-bufFun' ], 25 | ntmpi_03: [ 'cat', 'filterFB', 'varsawFB', 'pulselet', ], 26 | ntmpi_04: [ 'dog', 'formSing', 'revFB', 'xf-ringMod' ], 27 | ntmpi_05: [ 'envelo', 'kiteHi', 'rjkChaos', 'frya' ], 28 | ); 29 | 30 | ( 31 | 'name': 'raspi', // <- user name here 32 | 'numChans': 2, 33 | 'serverSetup': "serverBasic2.scd", 34 | 'hasGui': false, 35 | 36 | // the 4 sounds to load into the slots 37 | // 'defaultActives': [ 'allArm', 'dog', 'cat', 'revFB' ], 38 | 39 | 'defaultActives': q.startNdefs[q.hostName], 40 | 41 | influxPresets: [ 3, 12, 37, 42, 45, 86, \diagL ], 42 | // the preset key/name to set it to 43 | influxPreset: 3, 44 | 45 | // these are just filenames with collections of funcs for now 46 | effects: [ "allFX.scd" ], 47 | 48 | // the slotNames to put into q.mFX 49 | mfxSlotNames: [ 50 | '00_in', '0OnePolBal', '0_DBComp', '0_comp', '0_gate', '0freqBal', 51 | '1comby', '1holz', '1ixiDist', 52 | '3AdCVerb', '3ring', '3thrasher', 53 | '4ixiVerb', '5HPF', '5LPF', 54 | '6roto', '7Delay', 55 | '9endFilt', '9monofy', '9stereofy', 56 | 'ampFin' ], 57 | 'finalSetup': "~/ntmi/finalSetup.scd", 58 | 59 | ) 60 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/1_prefs/historical_2bUpdated/ntmi_prefs_username_example.scd: -------------------------------------------------------------------------------- 1 | // ////////// --------- this should go into user-specific ntmi_prefs files. 2 | 3 | // obsolete for anything else than our private setups' masterFX. 4 | 5 | // ~trioPlayers = ["arik", "laVulega", "isakhan"]; 6 | q.me = q.me ?? {unixCmdGetStdOut("whoami").split(Char.nl).first.asSymbol}; // got it at 00_loadMe 7 | 8 | // do all MasterFX stuff PER PERSON 9 | // get current values with and make sure to .add or .remove FX Blocks 10 | /* 11 | q.mFX.pxChain.proxy.document 12 | */ 13 | ( 14 | \laVulega: { 15 | q.mFX.pxChain.add('0OnePolBal', 1); 16 | q.mFX.pxChain.add('1holz', 0.5); 17 | q.mFX.pxChain.add('1ixiDist', 0.18); 18 | // q.mFX.pxChain.add('4ixiVerb', 0.125); 19 | q.mFX.pxChain.add('5LPF', 0.6); 20 | q.mFX.pxChain.add('7Delay', 0.125); 21 | q.mFX.pxChain.remove('0_DBComp'); 22 | 23 | q.mFX.pxChain.proxy.set('delayTime1', 0.42, 'delayTime2', 0.76, 'wet130', 0.6, 'combdecay', 6.8, 'wet20', 1, 'wet70', 0.18, 'wet150', 0.125, 'pregain', 1.46, 'wet30', 1, 'freqL', 700.0, 'wet170', 1, 'ixivAmp', 0.25, 'wet110', 0.125, 'ampLimit', 0.74, 'apDecay', 5.678, 'postgain', 1.0, 'dFreq', 2200, 'llag', 2.0, 'fadeTime', 3, 'predelay', 0.2, 'wet10', 1.0, 'mod', 0.6); 24 | 25 | q.ndefs.do{|nd, i| 26 | nd.vol_( #[ 0.25, 0.1, 0.4, 0.25][i]) 27 | 28 | }; 29 | 30 | }, 31 | \arik: { 32 | q.mFX.pxChain.add('3AdCVerb', 0.1); 33 | q.mFX.pxChain.add('3ring', 0.1); 34 | q.mFX.pxChain.add('5HPF', 0.1); 35 | }, 36 | 37 | \isakhan: { 38 | q.mFX.pxChain.add('0OnePolBal', 1); 39 | q.mFX.pxChain.add('1holz', 0.5); 40 | q.mFX.pxChain.add('1ixiDist', 0.18); 41 | //q.mFX.pxChain.add('4ixiVerb', 0.125); 42 | q.mFX.pxChain.add('5LPF', 0.6); 43 | //q.mFX.pxChain.add('7Delay', 0.125); 44 | q.mFX.pxChain.remove('0_DBComp'); 45 | 46 | 47 | q.mFX.pxChain.proxy.set('delayTime1', 0.42, 'delayTime2', 0.76, 'wet130', 0.6, 'combdecay', 6.8, 'wet20', 1, 'wet70', 0.18, 'wet150', 0.125, 'pregain', 1.46, 'wet30', 1, 'freqL', 700.0, 'wet170', 1, 'ixivAmp', 0.25, 'wet110', 0.125, 'ampLimit', 0.74, 'apDecay', 5.678, 'postgain', 1.0, 'dFreq', 2200, 'llag', 2.0, 'fadeTime', 3, 'predelay', 0.2, 'wet10', 1.0, 'mod', 0.6); 48 | 49 | q.ndefs.do{|nd, i| 50 | nd.vol_( #[ 0.25, 0.25, 0.4, 0.1][i]) 51 | 52 | }; 53 | } 54 | )[q.me].value; 55 | 56 | 57 | /* 58 | { 59 | q.mFX.pxChain.add('3ring', 0.1); 60 | q.mFX.pxChain.add('5LPF', 0.1); 61 | } 62 | */ -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/2_process_presets/2a_bufferLoader.scd: -------------------------------------------------------------------------------- 1 | /// load global buffers 2 | 3 | var globalBufFolder = NTMI.globalBufFolder ? (NTMI.dir.userSFExamples +/+ ".."); 4 | var bufsName = \global; 5 | var hasNoSFs = { |path| 6 | SoundFile.collect(globalBufFolder +/+ "*").isEmpty 7 | }; 8 | 9 | NTMI.dir.scSoundfiles = Platform.resourceDir +/+ "sounds"; 10 | 11 | // buffers should be in global dict q, not in NTMI.bufs 12 | q = q ? (); 13 | q.bufs = q.bufs ? (); 14 | 15 | if (globalBufFolder.isNil or: { hasNoSFs.(globalBufFolder) }) { 16 | globalBufFolder = NTMI.dir.userSFExamples; 17 | if (hasNoSFs.(globalBufFolder)) { 18 | globalBufFolder = NTMI.dir.scSoundfiles; 19 | }; 20 | }; 21 | 22 | // if present, load global bufferfolder into q.bufs.global when booting 23 | MFdef('bufReload').add(bufsName, { 24 | MFdef(\bufLoad).value( 25 | globalBufFolder, 26 | {|buffers| // global doneFunc 27 | "*** % global buffers loaded from:\n%.\n" 28 | .postf(q.bufs[bufsName].size, globalBufFolder); 29 | "// assign with:\n" 30 | "MFdef('bufSetRange').(Ndef('xyz'), q.bufs[%], %);\n" 31 | .postf(bufsName.cs, bufsName.cs); 32 | }, 33 | 'global' 34 | ); 35 | }); 36 | 37 | // and do it once when the file runs 38 | MFdef('bufReload').funcDict[bufsName].value; 39 | 40 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/2_process_presets/2b_liveInput.scd: -------------------------------------------------------------------------------- 1 | q=q?(); 2 | 3 | Spec.add(\inChanA, [0, 7, 0, 1]); 4 | Spec.add(\inChanB, \inChanA.asSpec); 5 | Spec.add(\inAmpA, [0, 8, \amp] ); 6 | Spec.add(\inAmpB, \inAmpA.asSpec); 7 | Spec.add(\threshG, \amp.asSpec ); 8 | 9 | q.liveInput = Ndef(\liveInput, { |inChanA=0, inAmpA=1, inChanB=1, inAmpB=0, threshG=0.01| 10 | var in = SoundIn.ar([inChanA, inChanB], [inAmpA, inAmpB]).sum; 11 | var amp = Amplitude.kr(in, 0, 2); 12 | in = (amp>threshG) * in; 13 | /* in = Compander.ar( 14 | in, in, 15 | threshG, 10, 1, 16 | 0.0001, 0.6 //attG, decG 17 | ) + BrownNoise.ar(0.00001).dup(q.numChans); // no bangs!*/ 18 | Limiter.ar(in); 19 | }); 20 | 21 | Ndef(\liveInput); 22 | 23 | /* 24 | q.liveInput.playN( (1..q.numChans)-1, vol: 0); 25 | q.liveInput.scope; 26 | */ 27 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/2_process_presets/2e_presetPilot.scd: -------------------------------------------------------------------------------- 1 | Tdef(\presetPilot).addSpec(\preProb, [0, 1, 4.4]); 2 | Tdef(\presetPilot).addSpec(\sndProb, [0, 1, 4.4]); 3 | 4 | Tdef(\presetPilot).set(\preProb, 0.1); 5 | Tdef(\presetPilot).set(\sndProb, 0.05); 6 | 7 | Tdef(\presetPilot, { |e| 8 | inf.do { |i| 9 | 1.wait; 10 | if (e.sndProb.coin) { 11 | var slot = NTMI.ndefs.size.rand; 12 | NTMI.slots.stepNext(slot); 13 | NTMI.slots.playAt(slot); 14 | }; 15 | if (e.preProb.coin) { 16 | var ndef = NTMI.slots.nowPlaying.choose; 17 | var ndefpre = NdefPreset(ndef).postln; 18 | var nextpre = ndefpre.getSetNames.choose; 19 | ndefpre.xfadeTo(*[nextpre, exprand(3, 13).round(0.1)].postln); 20 | }; 21 | }; 22 | 23 | }); 24 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/0c_influxZOOM_modes.scd: -------------------------------------------------------------------------------- 1 | // NTMI.zoom sets all the influx'es inScalers AND RandomOrbit's excursion from current state. 2 | 3 | NTMI.zoom = NTMI.zoom?1; 4 | 5 | // tune this for jitter on zoom pot on NTMI 6 | Spec.add(\zoom, [0, 1, \lin, 0.025]); 7 | 8 | NTMI.setZoom = {|ev, val| 9 | val = \zoom.asSpec.constrain(val); 10 | // "global ZOOM f. RandomOrbits and Influxes: %\n".postf(val); 11 | NTMI.zoom = val; 12 | 13 | NTMI.inphlux.inScaler = NTMI.zoom; 14 | "zoom: %\n".postf(NTMI.zoom); 15 | // return value 16 | val 17 | }; 18 | // increment / decrement 19 | NTMI.incZoom = {|ev, inc=0.1| 20 | NTMI.setZoom((NTMI.zoom + inc)); 21 | }; 22 | 23 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/2_volSteps.scd: -------------------------------------------------------------------------------- 1 | 2 | 3 | MFdef(\mainVolStep).add(\step, { |inc = 0| 4 | // for fast turns, accelerate changes: 5 | // 0.0 is linear, step1 -> 1, step 2 -> 2 etc 6 | // 1.0 is quadratic, step1 -> 1, step 2 -> 4 etc 7 | var acceleration = inc.abs ** 1.0; 8 | "mainVol % by %\n".postf([\down, \up].wrapAt(inc.clip(0, 1)), inc); 9 | RelSet(MainFX(s).proxy, \mainVol, inc * acceleration * 0.01); 10 | }); 11 | 12 | MFdef(\ndefVolStep).add(\step, { |ndef, step = 1| 13 | var acceleration = step.abs ** 1.0; 14 | var stepsize = 0.01; // 100 steps from 0 to 1 15 | var ampspec = \amp.asSpec; 16 | "% ndefVolStep %\n".postf(ndef, step); 17 | ndef.vol = ampspec.map(ampspec.unmap(ndef.vol) + (step * acceleration * stepsize)) 18 | }); 19 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/3_detect_nUFO.scd: -------------------------------------------------------------------------------- 1 | /* 2 | OSCdef.trace(true, true); 3 | OSCdef.trace(false); 4 | MKtl.all.nUFO; // exists? 5 | 6 | nUFO startup logic: 7 | When an Airborne Instruments nUFO boots,it makes its own WLAN with 8 | SSID name: NTMI-00x -- (serial number) 9 | password: NTMINTMI 10 | 11 | its router address is NetAddr(169.254.1.1, 57120), 12 | and it immediately sends /ntmi/caps and /ntmi/imu messages. 13 | So nUFO needs NetAddr to be 57120! 14 | 15 | OSCdef(\nUFOdetectIMU) listens for /ntmi/imu, 16 | and loads all nUFO files when a nUFO message is detected; 17 | then MKtl(\nUFO) is created, and Tdef(\allLEDs) 18 | plays its little light patterns on the nUFO LEDs; 19 | then it sends NTMI playing state for display. 20 | 21 | // re-enable detection with: 22 | OSCdef(\nUFOdetectIMU).enable; 23 | 24 | */ 25 | 26 | NTMI.nUFO = NTMI.nUFO ? (); 27 | NTMI.nUFO.waitFornUFO = true; 28 | 29 | NTMI.nUFO.loadnUFO = { |dict, force = false| 30 | var senderAddr = NTMI.nUFO.senderAddr; 31 | if (force or: NTMI.nUFO.waitFornUFO) { 32 | defer { 33 | if (MKtl.all.nUFO.isNil) { 34 | "*** loading nUFO interface:".postln; 35 | LoadMe(NTMI.dir.setup +/+ "3_interfaces/nUFO/*nUFO*.scd"); 36 | }; 37 | if (senderAddr.notNil) { 38 | 39 | MKtl.all.nUFO.device.updateSrcDstAddr(senderAddr.ip, senderAddr.port) 40 | }; 41 | "*** nUFO loaded! .".postln; 42 | }; 43 | } 44 | }; 45 | 46 | // detect nUFO presence, assuming nUFO always sends imu: 47 | OSCdef(\nUFOdetectIMU, { |msg, time, senderAddr| 48 | NTMI.nUFO.senderAddr = senderAddr; 49 | NTMI.nUFO.loadnUFO(true); 50 | // disable detector when loaded. 51 | // reopen with OSCdef(\nUFOdetectIMU).enable; 52 | OSCdef(\nUFOdetectIMU).disable; 53 | }, "/ntmi/imu").enable; 54 | 55 | // still hypothetical, use when multiple nUFOs in the same network. 56 | /* 57 | NTMI.nUFO.knownnUFOs = []; 58 | // wait for nUFO ID, decide whether to connect: 59 | OSCdef(\nUFOdetectID, { |msg| 60 | var newID = msg[1]; 61 | if (NTMI.nUFO.knownnUFOs.includes(newID).not) { 62 | NTMI.nUFO.knownnUFOs = NTMI.nUFO.knownnUFOs.add(newID); 63 | "*** NTMI.knownnUFOs : %\n\n".postf(NTMI.nUFO.knownnUFOs.cs); 64 | if (NTMI.nUFO.myExpectedID != newID) { 65 | if (MKtl.all.nUFO.isNil) { 66 | NTMI.nUFO.loadnUFO 67 | }; 68 | }; 69 | msg.postln; 70 | }, "/ntmi/ID") 71 | */ 72 | 73 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/4_RandomOrbit_clavier.scd: -------------------------------------------------------------------------------- 1 | /* 2 | NTMI.bin.randOrb(64.rand); 3 | */ 4 | 5 | ( 6 | // RandomOrbit binary clavier: 7 | NTMI.bin = NTMI.bin ? (); 8 | NTMI.bin.binkey = 1; 9 | 10 | NTMI.bin.randOrb = { |dict, newNum| 11 | var newSetName; 12 | if (NTMI.bin.binkey != newNum) { 13 | NTMI.bin.binkey = newNum; 14 | 15 | if(newNum > 0) { 16 | "randOrb newNum: %\n".postf(newNum); 17 | 18 | // ndefs now playing and not decoupled: 19 | NTMI.inph.toSetNow.do { |px| 20 | var pre = NdefPreset(px); 21 | 22 | // if outside presets, use newNum as random seed 23 | if(newNum >= pre.settings.size){ 24 | pre.setCurrIndex(newNum, NTMI.zoom); 25 | ">>> % setRand seed: %\n".postf(pre, newNum); 26 | pre.proxy.addHalo(\randSeed, newNum); 27 | }{ 28 | var name = pre.settings[newNum].key; 29 | pre.setCurrIndex(newNum, NTMI.zoom); 30 | pre.setProxy(name); 31 | ">>> % preset index: %\n".postf(pre, newNum); 32 | pre.proxy.addHalo(\randSeed, nil); 33 | } 34 | } 35 | } 36 | } 37 | }; 38 | ) 39 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/5b_RandomOrbit_switcher.scd: -------------------------------------------------------------------------------- 1 | // RandomOrbit chordal keyboard example: 2 | // 3 | // 6 keys with two states - this is the maximum for macOS keyboards 4 | // - if pressed within chordTime, the bits accumulate, then fire as one change 5 | // - if all released to 0 within chordTime, the chord number before releases is held 6 | 7 | /// for nufo, update to 8 pads 8 | /// make sure pads release fast enough and evenly enough 9 | /// so that holding last random chord works! 10 | 11 | 12 | ( 13 | NTMI.ro = NTMI.ro ? (); 14 | NTMI.ro.bits = 0 ! 6; 15 | NTMI.ro.letterKeys = "weruio"; // macOS only allows 6 keys at the same time 16 | NTMI.ro.powers = [1, 2, 4, 8, 16, 32]; 17 | NTMI.ro.num = { |ro| (ro.powers * ro.bits).sum }; 18 | NTMI.ro.firstval = 1; 19 | NTMI.ro.collecting = false; 20 | NTMI.ro.lastval = 1; 21 | NTMI.ro.str = { |ro| NTMI.ro.bits.join + "->" + NTMI.ro.num }; 22 | 23 | NTMI.ro.chordTime = 0.03; 24 | NTMI.ro.font = Font(Font.defaultMonoFace, 21); 25 | NTMI.ro.bigFont = Font(Font.defaultMonoFace, 34); 26 | 27 | NTMI.ro.getPressed = { |dict, index, value| 28 | if (NTMI.ro.collecting.not) { 29 | "collecting ...".postln; 30 | NTMI.ro.firstval = NTMI.ro.num; 31 | NTMI.ro.collecting = true; 32 | defer { NTMI.ro.uv.refresh }; 33 | }; 34 | NTMI.ro.bits[index] = value; 35 | // use Tdef to unschedule if already 36 | NTMI.ro.endTask.stop.play; 37 | }; 38 | 39 | 40 | NTMI.ro.endTask = TaskProxy({ 41 | NTMI.ro.chordTime.wait; 42 | NTMI.bin.randOrb(NTMI.ro.num); 43 | 44 | NTMI.ro.lastval = if (NTMI.ro.num == 0, NTMI.ro.firstval, NTMI.ro.num); 45 | defer { NTMI.ro.uv.refresh }; 46 | NTMI.ro.collecting = false; 47 | }).quant_(0); 48 | 49 | NTMI.ro.letterKeys.do { |char, i| 50 | KeyPlayer(\ro).putDown(char, { |char| NTMI.ro.getPressed(i, 1) }, noRep: true); 51 | KeyPlayer(\ro).putUp(char, { |char| NTMI.ro.getPressed(i, 0) }); 52 | }; 53 | ) 54 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/7_oscar.scd: -------------------------------------------------------------------------------- 1 | /* 2 | OscRouter for internet influences: 3 | 4 | all NTMIs can send to an OSCRouter server, 5 | which relays messages to other running NTMIs. 6 | The first use of these is the changeVectors 7 | created by local interfaces in setRel mode, 8 | which go to influence all running processes 9 | as the source 'xflux'. 10 | 11 | When OSCRouter address cannot be reached, 12 | e.g. when using nUFO local network, or generally not internet connection, 13 | NTMI.oscar should not try to join, to avoid network error messages. 14 | 15 | NTMI.oscar.close; 16 | NTMI.oscar.join; 17 | 18 | 19 | 20 | */ 21 | 22 | // the environment for oscrouter 23 | NTMI.oscar = NTMI.oscar ? (); 24 | NTMI.oscar.verbose = false; 25 | 26 | NTMI.oscar.myname = NTMI.oscar.myname ? NTMI.myname; 27 | 28 | NTMI.mypwd = NTMI.mypwd ? "senha"; 29 | 30 | // use gencomp oscserver as default 31 | // "gencomp.medienhaus.udk-berlin.de".gethostbyname.asIPString; 32 | NTMI.oscar.udkServerName = "gencomp.medienhaus.udk-berlin.de"; 33 | NTMI.oscar.udkServerIP = NTMI.oscar.udkServerIP ? "194.95.202.114"; 34 | 35 | ///// testIP does not work properly yet: 36 | ///// when in nUFO or flatcat network, 37 | // .testIP returns true even though it cannot reach the online server 38 | NTMI.oscar.testIP = { 39 | NTMI.oscar.reachedServer = false; 40 | try { 41 | NetAddr(NTMI.oscar.udkServerIP, 57120).sendMsg(\test); 42 | NTMI.oscar.reachedServer = true; 43 | }; 44 | NTMI.oscar.reachedServer 45 | }; 46 | 47 | 48 | // always use NTMI.oscar.sendMsg wrapper: 49 | // will quietly dummy-send when network drops out 50 | NTMI.oscar.sendMsg = { |oscar ... args| 51 | if (NTMI.oscar.oscar.notNil and: { NTMI.oscar.oscar.hasJoined }) { 52 | NTMI.oscar.oscar.sendMsg(*args); 53 | } { 54 | if (NTMI.oscar.verbose) { 55 | "NTMI.oscar.oscar cannot send ATM".postln 56 | }; 57 | }; 58 | }; 59 | 60 | NTMI.oscar.quit = { 61 | try { 62 | NTMI.oscar.oscar.close; 63 | NTMI.oscar.oscar = nil; 64 | }; 65 | }; 66 | 67 | // if it is reachable, make it: 68 | NTMI.oscar.makeServer = { 69 | "NTMI.oscar.makeServer".postln; 70 | 71 | if (NTMI.oscar.testIP.not ) { 72 | "*** NTMI.oscar: cannot start, because serverIP not reached.".postln; 73 | } { 74 | NTMI.oscar.oscar = OSCRouterClient(NTMI.oscar.myname, "ntmi", 75 | serverAddr: NTMI.oscar.udkServerIP, 76 | userPassword: NTMI.mypwd, 77 | groupPassword: "senha" 78 | ).postln; 79 | 80 | fork { 81 | 0.2.wait; 82 | NTMI.oscar.oscar.join({ 83 | // only start sending when 84 | NTMI.statusSkip.stop; 85 | NTMI.statusSkip = SkipJack({ 86 | MFdef(\sendStatus).value; 87 | }, 0.1); 88 | "*** NTMI.oscar is UP!".postln; 89 | }); 90 | } 91 | } 92 | }; 93 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat.scd: -------------------------------------------------------------------------------- 1 | "redirecting flatcat/*flatcat* to flatcat folder.".postln; 2 | "flatcat/*flatcat*.scd".loadRelative; 3 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/0_flatcat_detect.scd: -------------------------------------------------------------------------------- 1 | /* 2 | MKtl.all[\flatcat].free; 3 | */ 4 | 5 | // the OSC port number flatcat sends on 6 | thisProcess.openUDPPort(8999); 7 | 8 | OSCdef(\detectFlatcat, { |msg, time, senderAddr, recvPort| 9 | 10 | fork ({ 11 | if (MKtl.all.flatcat.isNil) { 12 | "*** new flatcat detected! loading setup.".postln; 13 | LoadMe("SpecialUses/flatcat/*flatcat*.scd", NTMI.dir.setup); 14 | }; 15 | "*** detected flatcat - updating source to: %\n".postf(senderAddr.cs); 16 | if (MKtl(\flatcat).hasDevice) { 17 | MKtl(\flatcat).device.updateSrcAddr(senderAddr.ip, senderAddr.port); 18 | "*** updated to: ".post; 19 | MKtl.all[\flatcat].device.source.postcs; 20 | OSCdef(\detectFlatcat).disable; 21 | } 22 | }, AppClock); 23 | 24 | }, \flatcat).enable; 25 | 26 | 27 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/2_flatcat2_gui.scd: -------------------------------------------------------------------------------- 1 | ///// GUI stuff: 2 | /* // put at the end of your startup: 3 | 4 | WinBounds.showOrMake(\flatcat); 5 | 6 | */ 7 | 8 | ( 9 | NTMI.addInterfaceFile(\flatcat, "SpecialUses/flatcat/flatcat_gui.scd"); 10 | 11 | // add number readouts to gui: 12 | WinBounds.addMake(\flatcat, { 13 | var mg = MKtl(\flatcat).gui.showLabels; 14 | var win = mg.parent; 15 | var vbounds = win.view.bounds; 16 | // a zone for the extra buttons etc 17 | var butzone = CompositeView(win, Rect(160, 0, 750, 25)).background_(Color.rand); 18 | 19 | // a userview to draw the numeric values on 20 | var uv = UserView(win, vbounds.top_(vbounds.height).height_(30)) 21 | .background_(Color.grey); 22 | 23 | try { win.alpha_(NTMI.g.alpha) }; 24 | win.bounds = win.bounds.height_(win.bounds.height + 30); 25 | 26 | uv.drawFunc = { |uv| 27 | var string = MKtl(\flatcat).elAt.deviceValue.collect { |val| 28 | (val.round(0.001).asString ++ " ").clipExtend(5) 29 | }; 30 | Pen.stringCenteredIn(string.join(" "), 31 | uv.bounds.extent.asRect, 32 | Font(Font.defaultMonoFace, 16.5), 33 | Color.green); 34 | }; 35 | uv.frameRate_(10).animate_(true); 36 | 37 | butzone.addFlowLayout(2@2, 1@1); 38 | Button(butzone, 80@20) 39 | .states_([[\oscConnect, nil, Color.grey(0.85)], [\connected, nil, Color.green]]) 40 | .action_({ OSCdef(\flatcat2mktl).enable }); 41 | 42 | Button(butzone, 80@20) 43 | .states_([[\flatcatSim, nil, Color.grey(0.85)], [\flatcatSim, nil, Color.green]]) 44 | .action_({ |b| var t = Tdef(\flatcatSim); var pls = t.isPlaying; 45 | if (pls) { t.stop } { t.play }; b.value = pls.not.binaryValue }); 46 | Button(butzone, Rect(240, 2, 80, 20)) 47 | .states_([[\flatcatViz, nil, Color.grey(0.85)]]) 48 | .action_({ WinBounds.showOrMake(\flatcatViz) }); 49 | 50 | EZPopUpMenu(butzone, 120@20, \infMode, [\rel, \abs], { |pop| 51 | if (pop.value == 0) { NTMI.flatcat.setRel } { NTMI.flatcat.setAbs } 52 | }, labelWidth: 60); 53 | EZSlider(butzone, 200@20, \zoom, \unipolar, 54 | { |sl| NTMI.flatcat.zoom = sl.value}, 55 | labelWidth: 40); 56 | win; 57 | }); 58 | try { Window.find(\flatcat).close }; 59 | WinBounds.showOrMake(\flatcat); 60 | ); 61 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/3_flatcat3_trigchange.scd: -------------------------------------------------------------------------------- 1 | /** 2 | when flatcat makes unusually big moves, 3 | trigger several possible layers of change: 4 | - new presets on the sounds 5 | - new sounds 6 | - new mainfx presets 7 | - optionally, add function to onData to trigger when big change. 8 | 9 | ToDo: 10 | maybe split into separate functions for tracking and triggering? 11 | 12 | Tune: 13 | // trig func by hand 14 | NTMI.flatcat.onData.value; 15 | // see change profile for last 10 secs 16 | NTMI.flatcat.changeData.plot; 17 | 18 | NTMI.flatcat[\onData].activeNames; 19 | 20 | **/ 21 | 22 | // internal data 23 | NTMI.flatcat = NTMI.flatcat ? (); 24 | NTMI.flatcat.changeData = 0!200; 25 | NTMI.flatcat.changeIndex = 0; 26 | NTMI.flatcat.changeLastTime = 0; 27 | 28 | // tunable settings: 29 | NTMI.flatcat.changeThresh = 0.2; 30 | NTMI.flatcat.changeMinTime = 5; 31 | NTMI.flatcat.newSndProb = 0.2; 32 | NTMI.flatcat.newMfxProb = 0.1; 33 | 34 | 35 | ( 36 | NTMI.flatcat[\onData].add(\meta, { 37 | var fc = NTMI.flatcat; 38 | var now = Main.elapsedTime.round(0.01); 39 | var timeSinceLastChange = now - fc.changeLastTime; 40 | var canChangeTime = timeSinceLastChange > fc.changeMinTime; 41 | var changeSum = MKtl(\flatcat).elAt.sum { |el| 42 | (el.value - el.prevValue).abs 43 | }.round(0.001); 44 | 45 | var canChangeDiff = changeSum > fc.changeThresh; 46 | 47 | ////// debug: 48 | // "now: % lastTime: % diff: ".postf(now, fc.changeLastTime, now - fc.changeLastTime); 49 | // "%\n".postf((now - fc.changeLastTime).round(0.01)); 50 | // "*** timeOK: %\n".postf(canChangeTime); 51 | // 52 | // "change: % > %: %\n".postf(changeSum, fc.changeThresh, canChangeDiff); 53 | 54 | fc.changeData.put(fc.changeIndex, changeSum); 55 | fc.changeIndex = (fc.changeIndex + 1) mod: fc.changeData.size; 56 | 57 | // store it so later funcs can use it: 58 | fc.doChange = canChangeTime and: canChangeDiff; 59 | 60 | if (fc.doChange) { 61 | var slotIndex = 4.rand; 62 | var ndef = NTMI.ndefs[slotIndex]; 63 | var preset = NdefPreset(ndef); 64 | 65 | fc.changeLastTime = now; 66 | 67 | "*** flatcat changes: ".postln; 68 | "timeSinceLastChange: %\n".postf(timeSinceLastChange.round(0.01)); 69 | "sum % > %: %\n".postf(changeSum, fc.changeThresh, canChangeDiff); 70 | 71 | if (fc.newSndProb.coin or: (NTMI.slots.nowPlaying.size < 1)) { 72 | "*** new sound: ".post; 73 | NTMI.slots.stepNext(slotIndex); 74 | defer { NTMI.slots.playAt(slotIndex) }; 75 | NTMI.ndefs[slotIndex].postln; 76 | }; 77 | if (fc.newMfxProb.coin) { 78 | "*** new mainFX: ".post; 79 | MFdef(\mainPreStep).value; 80 | }; 81 | // preset always changes 82 | if (preset.settings.size < 2 or: { 0.5.coin }) { 83 | var seed = rrand(12, 1000); 84 | "%: setRand seed %\n".postf(preset, seed); 85 | preset.setRand(1.0, seed: seed); 86 | } { 87 | NTMI.pre.stepNdefInf(ndef); 88 | }; 89 | }; 90 | \meta 91 | }); 92 | ) 93 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/5_flatcat5_fwdSend.scd: -------------------------------------------------------------------------------- 1 | /* 2 | OSCdef.trace(true, true) 3 | OSCdef.trace(false) 4 | */ 5 | 6 | // set the addresses to forward to: 7 | // known addresses in local network, 8 | // and thru port 8999 like a direct flatcat; 9 | // should work to wake up 10 | NetAddr.broadcastFlag = true; 11 | NTMI.flatcat.fwdAddrs = List[ 12 | NetAddr("192.168.4.195", 8999) 13 | ]; 14 | 15 | NTMI.flatcat.fwdFunc = OSCFunc({ |msg| 16 | NTMI.flatcat.fwdAddrs.do(_.sendMsg(*msg)); 17 | }, \flatcat).permanent_(true); 18 | 19 | 20 | NTMI.flatcat.fwdFunc.disable; 21 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/README_flatcat_ntmi.txt: -------------------------------------------------------------------------------- 1 | // Installing NTMI and connecting it to flatcat osc: 2 | 3 | // if you don't have NTMI installed: 4 | Quarks.install("NTMI"); 5 | 6 | // if you do, get the latest version: 7 | Quark("NTMI").update; 8 | // and update its dependencies too: 9 | Quark("NTMI").dependencies.do(_.update); 10 | 11 | thisProcess.recompile; 12 | 13 | // this should start the default NTMI setup: 14 | NTMI.run; 15 | // and end with a fullscreen GUI called ntmi_MainStage! 16 | // if not, try throwing away the NTMI quark, and reinstall it! 17 | // same for the dependencies if they do not update properly. 18 | 19 | 20 | 21 | // if all is well, try playing with the NTMI: 22 | // click on one of the 4 left-hand slots -> should play a sound 23 | // on its rightside popup, try selecting different sound presets 24 | // on its leftside popup, try selecting different sound processes 25 | 26 | // on the left row of buttons - Butz: 27 | // click on inphlux, 28 | // and try playing on the XY field -> sound should change! 29 | // then try mouse-drawing on the xyz etc field -> 30 | 31 | 32 | // when all seems to work, run the flatcat setup: 33 | 34 | // flatcat files in the NTMI setup are here: 35 | (NTMI.dir.setup +/+ "SpecialUses/flatcat/").openOS; 36 | // copy them to NTMI user folder here: 37 | NTMI.dir.user.openOS; 38 | 39 | // open and run the whole file; 40 | // and adapt as desired! 41 | (NTMI.dir.user +/+ "flatcat2NTMI_better.scd").openOS; 42 | 43 | // to see how the parameters change: 44 | Butz(\NTMI).run(\slotSounds); 45 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/flatCAT_startupFile.scd: -------------------------------------------------------------------------------- 1 | /*** example for NTMI & flatcat setup *** 2 | 3 | // To use with StartupFile, do 4 | StartupFile.writeStartupFileToExternalPath(\flatcat_NTMI, 5 | thisProcess.nowExecutingPath; 6 | ); 7 | // then to choose it, do 8 | StartupFile.dialog; 9 | *****/ 10 | 11 | // Schedule loading the flatcat files 12 | // after the full NTMI setup finishes: 13 | NTMI.finalSetup = { 14 | // load flatcat setup/connection file 15 | LoadMe("3_interfaces/optionals/flatcat/*flatcat*.scd", NTMI.dir.setup); 16 | 1.wait; 17 | NTMI.flatcat.postln; 18 | // NTMI.g.main.imuUVMFunc.add(\flatcat, NTMI.flatcat.drawFunc); 19 | // // NTMI.g.main.imuUVMFunc.disable(\imuPad); 20 | // NTMI.g.main.imuUV.animate_(true); 21 | }; 22 | 23 | // now run NTMI setup, then flatcat 24 | NTMI.run; 25 | 26 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/flatcat/flatcat.desc.scd: -------------------------------------------------------------------------------- 1 | 2 | // make an MKtl description dict for the flatcat: 3 | ( 4 | descName: "flatcat", 5 | deviceName: "flatcat", 6 | protocol: \osc, 7 | deviceType: \robotPet, 8 | elementTypes: [\sensor], 9 | status: ( 10 | linux: "unknown", 11 | osx: "unknown", 12 | win: "unknown" 13 | ), 14 | 15 | idInfo: "flatcat", 16 | // info for flatcat in accesspoint mode 17 | netAddrInfo: (ipAddress: "192.168.4.1", srcPort: 46757, recvPort: 8999 ), 18 | 19 | deviceInfo: ( 20 | vendorURI: "https://flatcat.berlin", 21 | description: "robot pet", 22 | features: [ 23 | ], 24 | longName: "jetpack lab flatcat", 25 | notes: "", 26 | ), 27 | 28 | specs: ( 29 | 30 | 'voltage': [2.5, 6.5], 31 | 32 | 'temper': [10, 60], 33 | 'angle': [-0.5, 0.5], 34 | 'velo': \bipolar, 35 | 'curr': [-0.5, 0.5] 36 | ), 37 | 38 | collectives: ( 39 | alldata: ( 40 | oscPath: '/flatcat', 41 | elements: [ 42 | [\ubat], [\ubus], [\umot], 43 | 44 | [\temper0], [\angle0], [\velo0],[\curr0], 45 | [\temper1], [\angle1], [\velo1], [\curr1], 46 | [\temper2],[\angle2], [\velo2], [\curr2], 47 | ], 48 | ioType: \in 49 | ), 50 | ), 51 | 52 | elementsDesc: ( 53 | // input elements: 54 | shared: (elementType: 'slider', ioType: \collectiveIn), 55 | 56 | elements: [ 57 | 58 | ( key: \ubat, \spec: 'voltage' ), 59 | ( key: \ubus, \spec: 'voltage' ), 60 | ( key: \umot, \spec: 'voltage' ), 61 | 62 | ( key: \temper0, \spec: 'temper' ), 63 | ( key: \temper1, \spec: 'temper' ), 64 | ( key: \temper2, \spec: 'temper' ), 65 | 66 | ( key: \angle0, \spec: 'angle' ), 67 | ( key: \angle1, \spec: 'angle' ), 68 | ( key: \angle2, \spec: 'angle' ), 69 | 70 | ( key: \velo0, \spec: 'velo' ), 71 | ( key: \velo1, \spec: 'velo' ), 72 | ( key: \velo2, \spec: 'velo' ), 73 | 74 | ( key: \curr0, \spec: 'curr' ), 75 | ( key: \curr1, \spec: 'curr' ), 76 | ( key: \curr2, \spec: 'curr' ) 77 | ].collect { |el, i| 78 | el.put(\style, (column: i, height: 2)) 79 | } 80 | ) 81 | ); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/nUFO.scd: -------------------------------------------------------------------------------- 1 | "redirecting nUFO/*nUFO* to nUFO folder.".postln; 2 | "nUFO/*nUFO*".loadRelative; 3 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/nUFO/1c_allLEDs_nUFO.scd: -------------------------------------------------------------------------------- 1 | 2 | // test all led elements once: 3 | /* 4 | NTMI.nUFO.nUFO.mode = \full; 5 | Tdef(\allLEDs).play; 6 | 7 | // test wakeup ballet also from OSC: 8 | // if first time, or longer than 10 sec silence, do ballet 9 | NetAddr.localAddr.sendMsg("/ntmi/imu", 0.0); 10 | 11 | */ 12 | 13 | Tdef(\allLEDs).set(\dt, 0.1); 14 | Tdef(\allLEDs).set(\repeats, 1); 15 | 16 | Tdef(\allLEDs, { |ev| 17 | try { NTMI.nUFO.skip.stop }; 18 | ev.repeats.do { 19 | "leds back ON".postln; 20 | MKtl(\nUFO).elAt(\led, \bk).do { |led| 21 | led.value = 1; 22 | ev.dt.wait; 23 | }; 24 | 25 | "front on".postln; 26 | MKtl(\nUFO).elAt(\led, \fr).do { |led| 27 | led.value = 1; 28 | ev.dt.wait; 29 | }; 30 | 31 | "back OFF".postln; 32 | MKtl(\nUFO).elAt(\led, \bk).do { |led| 33 | led.value = 0; 34 | ev.dt.wait; 35 | }; 36 | 37 | "front off".postln; 38 | MKtl(\nUFO).elAt(\led, \fr).do { |led| 39 | led.value = 0; 40 | ev.dt.wait; 41 | }; 42 | }; 43 | 44 | // set to correct state now: 45 | try { NTMI.nUFO.skip.stop.play }; 46 | 47 | // sync back LEDs state 48 | 0.1.wait; 49 | NTMI.slots.actives.do { |ndef, i| 50 | var playVal = ndef.monitor.isPlaying.binaryValue; 51 | MKtl(\nUFO).elAt(\led, \bk, i).value = playVal; 52 | 0.05.wait; 53 | }; 54 | NTMI.nUFO.setModeIndex(NTMI.nUFO.modeIndex); 55 | 0.1.wait; 56 | NTMI.inph.setWPreIndex(NTMI.inph.presIndex); 57 | 0.1.wait; 58 | }); 59 | 60 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/nUFO/1f_nUFO_relative.scd: -------------------------------------------------------------------------------- 1 | 2 | /**** 3 | 4 | MKtl(\nUFO).elAt(\imu9, 0).valueAction = 0.6; 5 | 6 | /* 7 | MKtl(\nUFO).collAt.imu.valueAction_( 8 | MKtl(\nUFO).collAt.imu.value.collect(_ + 0.05.rand2) 9 | ); 10 | */ 11 | 12 | MKtl(\nUFO).elAt(\imu9).valueAction = 0.5; 13 | MKtl(\nUFO).elAt(\imu9).choose.action.funcDict.cs 14 | MFdef(\nUFOImuFunc).activeNames; 15 | 16 | MKtl(\nUFO).elAt(\imu9, 0).valueAction = 1.0.rand; 17 | 18 | Tdef(\testImuRel, { 19 | loop { 20 | MKtl(\nUFO).collAt(\imu).valueAction = 21 | MKtl(\nUFO).elAt(\imu9).value.collect { |val| 22 | (val + 0.02.rand2).clip(0, 1) 23 | }; 24 | 0.03.wait; 25 | } 26 | }).play; 27 | 28 | NTMI.nUFO.debugOn = true; 29 | NTMI.nUFO.debugOn = false; 30 | 31 | NTMI.nUFO.setRel; 32 | 33 | ***/ 34 | 35 | ( 36 | 37 | MFdef(\nUFOImuFunc).add(\setRel, { 38 | var imu = MKtl(\nUFO).elAt(\imu9); 39 | var diffs = imu.value - imu.prevValue; 40 | // write value back, so prevValue is correct next time 41 | imu.value = imu.value; 42 | 43 | if (NTMI.nUFO.debugOn) { 44 | "nUFOImuFunc setRel- ".post; 45 | "diffs: ".post; diffs.round(0.01).postln; 46 | "abs sum: ".post; diffs.sum.round(0.01).postln; 47 | }; 48 | // set imu to current values so prevVals are now currvals, 49 | // and we dont get the same diffs multiple times. 50 | // imu.value = imu.value; 51 | 52 | MFdef(\setRelInf).( 53 | (0..diffs.size-1), // imu is chans 0-8 54 | diffs, 55 | NTMI.inphlux.inScaler * NTMI.nUFO.zoom 56 | ); 57 | }, false); 58 | MFdef(\nUFOImuFunc).disable(\setRel); 59 | ); 60 | 61 | ( 62 | ///// 63 | MFdef(\capsToInph).disable(\setRel); 64 | MFdef(\capsToInph).disable(\setAbs); 65 | MKtl(\nUFO).elAt(\cap).do { |pad| pad.action.disable(\setAbs) }; 66 | 67 | // MKtl(\nUFO).elAt(\cap).action = { |el| 68 | // if (NTMI.nUFO.debugOn) { "pad global action".postln }; 69 | // // value change should set all other indiv. elements, 70 | // // so prevValues are correctly 0: 71 | // 72 | // MKtl(\nUFO).elAt(\cap).do { |el2| 73 | // if (el2 != el) { el2.value = el2.value }; 74 | // }; 75 | // // then trigger global set had come in: 76 | // MFdef(\capsToInph).value; 77 | // }; 78 | 79 | MFdef(\capsToInph).add(\setRel, { 80 | var diffs = NTMI.nUFO.padVals - NTMI.nUFO.prevPadVals; 81 | 82 | if (NTMI.nUFO.debugOn) { 83 | "capsToInph setRel - ".post; 84 | "diffs sum: ".post; diffs.sum.round(0.01).postln; 85 | }; 86 | 87 | // influence the playing slots 88 | MFdef(\setRelInf).( 89 | (0..diffs.size-1) + 9, // offset 9 for pads 90 | diffs, 91 | NTMI.inphlux.inScaler * NTMI.nUFO.zoom 92 | ); 93 | 94 | }, false); 95 | 96 | ); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/nUFO/1i_pads2bits_nUFO.scd: -------------------------------------------------------------------------------- 1 | /********* Using pads as triggers for binary clavier 2 | 3 | * all 8 pads are bits combined into a number 4 | and triggered when the number changes 5 | * every pad can also be an individual trigger 6 | 7 | MFdef(\capsToInph).activeNames; 8 | MFdef(\capsToInph).enable(\binKey); 9 | MFdef(\capsToInph).disable(\set); 10 | 11 | ***********/ 12 | ( 13 | NTMI.bin = NTMI.bin ? (); 14 | 15 | // tweak bin-threshold to your nUFO! 16 | // when pressing fully, 0.4 is reached after 3 frames, 17 | // and reached again falling from full level after 3-4 frames. 18 | 19 | NTMI.bin.thresh = 0.3; 20 | NTMI.bin.bins = 0!8; 21 | /* 22 | NTMI.bin.randOrb(64.rand); 23 | */ 24 | 25 | // sneak binkey function into func that triggers when pads array is received: 26 | MFdef(\capsToInph).add(\binKey, { 27 | // var binMap = [ 128, 64, 32, 16, 8, 4, 2, 1]; 28 | var binMap = [ 2, 8, 32, 128, 1, 4, 16, 64]; 29 | var bins = NTMI.nUFO.padVals.collect { |val| (val > NTMI.bin.thresh).binaryValue }; 30 | var newNum = (bins * binMap).sum; 31 | 32 | NTMI.bin.randOrb(newNum); 33 | 34 | ///// not sure indiv. cap actions are needed? 35 | MKtl(\nUFO).elAt(\cap).do { |cap, i| 36 | if (bins[i] != NTMI.bin.bins[i]) { 37 | "nUFO % : % -> %\n".postf(cap.name, NTMI.bin.bins[i], bins[i]); 38 | cap.action.value; 39 | } 40 | }; 41 | NTMI.bin.bins = bins 42 | }); 43 | MFdef(\capsToInph).disable(\binKey); 44 | ); 45 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/nUFO/1z_settingsExamples.scd: -------------------------------------------------------------------------------- 1 | 2 | /************* nUFO sensor modes *** 3 | 4 | The nUFO has several modes for playing the sounds, 5 | which determine whether and how the motion sensors and pads 6 | influence the sounds: 7 | - move means only use the motion sensor 8 | - touch means use the pads as continuous sensors 9 | - binary means use the pads as a binary clavier 10 | . to switch between the active sounds presets. 11 | - full is move + touch, 12 | - binmove is move + binary. 13 | 14 | NTMI.nUFO.printInterface 15 | // The full choice of these modes is: 16 | NTMI.nUFO.allModes = [ 17 | \full, // move/imu, touch/pads 18 | \move, // only move/imu 19 | \touch, // only touch/pads 20 | \binary, // pads as binary preset-switching clavier 21 | \binMove, // pads as binary, plus move/imu best in setRel mode 22 | \off // all 23 | ]; 24 | 25 | // The default mode choices are: 26 | NTMI.nUFO.modes 27 | -> [ 'full', 'touch', 'binary' ] 28 | */ 29 | // One choose freely which subset of allModes to use, e.g.: 30 | NTMI.nUFO.modes = [ 'full', 'touch', 'binary', 'binMove', 'off' ]; 31 | 32 | // To set which mode to go to, use e.g. 33 | NTMI.nUFO.modeIndex = 0; 34 | 35 | // to go to specific mode, do: 36 | NTMI.nUFO.setModeIndex(1); 37 | 38 | // to step thru the modes, use 39 | NTMI.nUFO.modeStep(1); // up 40 | NTMI.nUFO.modeStep(-1); // down 41 | NTMI.nUFO.modeStep(nil); // rand 42 | 43 | 44 | /*** NTMI.nUFO.influxModes ***** 45 | 46 | the nUFO can play the influx in two different modes: 47 | NTMI.nUFO.influxModes.postcs; 48 | [ 'setRel', 'setAbs' ] 49 | 50 | - setRel means differences on the nUFO get translated 51 | to differences on the parameters of the playing sounds; 52 | this allows multiple sources to change the sounds 53 | simultaneously, in effect, polyphonic influence. 54 | 55 | - setAbs means the full state of the nUFOs sensors, 56 | the current influx weights, and the sounds' last chosen presets 57 | will determine the exact setting of the process parameters. 58 | */ 59 | 60 | // this is how to set the initial influxMode: 61 | NTMI.nUFO.influxMode = \setRel; 62 | 63 | // and to switch between them when the nUFO is loaded, do: 64 | NTMI.nUFO.setRel; // or 65 | NTMI.nUFO.setAbs; // or 66 | 67 | // to set how much influence the nUFO has, use its zoom value: 68 | NTMI.nUFO.zoom = 0.5; 69 | 70 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/3_interfaces/optionals/shbobo_shnth.scd: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | SHBOBO SHNTH for NTMI: 4 | 5 | For now only the 4 piezos and 2 antenas inputs are used to influence Influx 6 | 7 | */ 8 | NTMI.shbobo_shnth = NTMI.shnth_shnth ? (); 9 | 10 | NTMI.shbobo_shnth.influxMode = \setRel; 11 | 12 | if (MKtlLookup.findByIDInfo("SHNTH_SHBOBO").size == 1) { 13 | "*** Shbobo Shnth found!".postln; 14 | MKtl.all['shbobo_shnth'].free; 15 | MKtl('shbobo_shnth', "shbobo-shnth"); 16 | }; 17 | 18 | if (MKtl('shbobo_shnth').isNil) { 19 | "No shbobo shnth found - creating virtual one.".postln; 20 | MKtl.all['shbobo_shnth'].free; 21 | MKtl('shbobo_shnth', "*shbobo-shnth"); 22 | }; 23 | "*** Shbobo Shnth loading ...".postln; 24 | 25 | MKtl('shbobo_shnth').addNamed(\influx, 26 | (MKtl('shbobo_shnth').elAt(\pz) ++ MKtl('shbobo_shnth').elAt(\an)).flat 27 | ); 28 | 29 | NTMI.shbobo_shnth.zoom = 0.5; 30 | 31 | MKtl('shbobo_shnth').elAt(\influx).do { |el, i| 32 | var inIndex = [9, 11, 12, 13, 14,15][i]; 33 | el.elemDesc.label = "infl" + inIndex; 34 | el.action = { |el| 35 | if (NTMI.shbobo_shnth.influxMode == \setAbs) { 36 | NTMI.inphlux.set(inIndex, el.value.unibi); 37 | } { 38 | MFdef(\setRelInf).( 39 | inIndex, 40 | (el.value - el.prevValue), 41 | NTMI.zoom * NTMI.shbobo_shnth.zoom 42 | ); 43 | } 44 | } 45 | }; 46 | 47 | MKtl('shbobo_shnth'); 48 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/3_4wins.scd: -------------------------------------------------------------------------------- 1 | //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 | // make 4 NdefGuis for the processes in the 4 NTMI slots. 3 | // when playing with influx, these show changes for the active ones. 4 | /* 5 | 6 | */ 7 | 8 | var q, g; 9 | NTMI.g = NTMI.g ? (); // global dict 10 | q = NTMI.q; 11 | g = NTMI.g; 12 | 13 | 14 | WinBounds.addMake('slotSounds', { |dict, name = \slotSounds| 15 | // g.bounds; // screenbounds 16 | var maxHeight = 480; // g.bounds.height - 20; 17 | var maxNumSlots = (maxHeight / 2 - 96 / 20 + 0.2).asInteger; 18 | var slotNames = q.ndefs.collect(_.key); 19 | 20 | var w = Window(name, 21 | Rect(g.bounds.width - 800, 22 | g.bounds.height - 650, 23 | 780, 24 | min(800, maxHeight - 20)) 25 | ).front; 26 | 27 | ("slotSounds Gui maxNumSlots: " + maxNumSlots).postln; 28 | w.addFlowLayout; 29 | w.alpha_(NTMI.g.alpha); 30 | w.background_(Color.grey(0.5)); 31 | g.ndefPreGuis = q.ndefs.keep(4).collect { |px, i| 32 | var ndefPre = NdefPreset(px); 33 | var gui = NdefPresetGui(ndefPre, maxNumSlots, w); 34 | var zonebounds = gui.zone.bounds; 35 | gui.zone.bounds = zonebounds.height_(zonebounds.height + 10); 36 | if (i.odd) { w.view.decorator.shift(0, 10) }; 37 | g.tuneNameView(gui.proxyGui); 38 | ProxyMeter.addNdefGui(gui.proxyGui); 39 | gui; 40 | }; 41 | 42 | g.ndefPreGuis.do { |gui| gui.skipjack.dt_(0.1) }; 43 | g[name] = w; 44 | // w.bounds = w.bounds.moveTo(450, 500); 45 | 46 | SkipJack({ 47 | var newNames = q.ndefs.collect(_.key); 48 | if (newNames != slotNames) { 49 | // "update 4 slotSounds!".postln; 50 | g.ndefPreGuis.do { |npg, i| 51 | var newPre = NdefPreset(q.ndefs[i]); 52 | if (npg.object_ != newPre) { npg.object = newPre } 53 | } 54 | }; 55 | slotNames = newNames; 56 | }, 0.2, { w.isClosed }, \presetWin); 57 | w; 58 | }); 59 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/5_randOrbKeyPlayer.scd: -------------------------------------------------------------------------------- 1 | 2 | ////// function to make a randomOrbitz KeyPlayerGui if needed 3 | 4 | ( 5 | WinBounds.addMake('randomOrbitz', { 6 | 7 | NTMI.g.kpgui = KeyPlayerGui(KeyPlayer(\ro)); 8 | NTMI.g.kpgui.parent.bounds_(NTMI.g.kpgui.parent.bounds.height_(300)); 9 | 10 | ///////// on separate window: 11 | //// NTMI.ro.uv = UserView().front.name_("rand"); 12 | ///////// on KeyPlayerGui window: 13 | NTMI.ro.uv = UserView(NTMI.g.kpgui.parent, Rect(0, 200, 420, 100)); 14 | NTMI.ro.uv.background_(Color.grey(0.95)); 15 | NTMI.ro.uv.drawFunc = { |uv| 16 | Pen.stringCenteredIn(NTMI.ro.str, (uv.bounds.extent * (1@0.5)).asRect, NTMI.ro.font); 17 | Pen.stringCenteredIn("rd:" + NTMI.ro.lastval, uv.bounds.extent.asRect, NTMI.ro.bigFont); 18 | }; 19 | NTMI.g.kpgui.parent.name = "randomOrbitz"; 20 | NTMI.g.kpgui.parent.view.alpha_(NTMI.g.alpha); 21 | }) 22 | ); 23 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/9_chanTestGui.scd: -------------------------------------------------------------------------------- 1 | 2 | WinBounds.addMake(\chanTest, { 3 | q.chantest = q.chantest ? (); 4 | q.chantest.win = Window("chanTest").front; 5 | q.chantest.win.addFlowLayout; 6 | 7 | Button(q.chantest.win, Rect(0,0,120,30)).states_([["STOP"]]) 8 | .action_({ 9 | q.chantest.pink.end; 10 | q.chantest.task.stop; 11 | 12 | }); 13 | q.chantest.pink.postln; 14 | q.chantest.butz = (1..8).collect { |i| 15 | Button(q.chantest.win, Rect(0,0,30,30)).states_([[i], [i, Color.black, Color.green]]) 16 | .action_({ q.chantest.pink.play(i - 1) }); 17 | }; 18 | 19 | q.chantest.taskgui = TdefGui(q.chantest.task, 4, q.chantest.win); 20 | q.chantest.taskgui.name = "looptest"; 21 | 22 | q.chantest.pinkgui = NdefGui(q.chantest.pink, 4, q.chantest.win); 23 | q.chantest.pinkgui.name_("PINK"); 24 | 25 | q.chantest.postln; 26 | q.chantest.win.alpha_(NTMI.g.alpha); 27 | }); 28 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/bigUV.scd: -------------------------------------------------------------------------------- 1 | NTMI.g.main.bigUV.drawFunc.add(\circleFXName, { |uv| 2 | var center = uv.bounds.extent * 0.5; 3 | Pen.translate(center.x, center.y); 4 | Pen.addArc(0@0, center.y * 0.98, 0, 2pi); 5 | // shape: 6 | Pen.color_(Color.white); 7 | Pen.width = 3; 8 | Pen.stroke; 9 | 10 | 11 | if (NTMI.usesMainFX) { 12 | var fontScaler = uv.bounds.height / 900 * 1.618; 13 | var mainIndex = NTMI.mfx.domainIndex ? -1; 14 | var domainName = NTMI.mfx.preNames[mainIndex] ? "¿-?"; 15 | "bigUV updating.".postln; 16 | 17 | Pen.rotate(mainIndex.linlin(-1, NTMI.mfx.preNames.size, 0.5pi, -0.5pi)); 18 | Pen.scale(fontScaler, fontScaler); 19 | Pen.stringCenteredIn(domainName, 20 | Rect.aboutPoint(0@0, center.x, 40), 21 | NTMI.g.fontFat, 22 | Color.fromArray(NTMI.inph.currCounterCol).alpha_(0.4) 23 | ); 24 | }; 25 | }); 26 | 27 | NTMI.g.main.bigUVUpdate = { 28 | defer { 29 | if (NTMI.usesMainFX) { 30 | NTMI.g.main.bigUV.refresh; 31 | }; 32 | } 33 | }; 34 | 35 | // only update if using mainFX 36 | if (NTMI.usesMainFX) { 37 | MFdef('mainPre').add(\updateMain, { NTMI.g.main.bigUVUpdate }); 38 | } -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/clock.scd: -------------------------------------------------------------------------------- 1 | // maainstage clock and gui 2 | 3 | /////// Clock display shows how long something has been running 4 | /* 5 | Tdef(\clocK).gui; 6 | 7 | Tdef(\clocK).set(\isRunning, true); 8 | // jumps back to zero when stopped 9 | Tdef(\clocK).set(\isRunning, false); 10 | 11 | // watch some Tdef to see how long a piece has been running 12 | Tdef(\clocK).set(\isRunning, { Tdef(\watchMe).isPlaying }); 13 | 14 | Tdef(\watchMe).play; 15 | Tdef(\watchMe).stop; 16 | 17 | NTMI.g.main.clockZone = nil; 18 | 19 | NTMI.g.main.clockZone.bounds; 20 | */ 21 | 22 | NTMI.g.clok = NTMI.g.clok ? (); 23 | // 24 | if (NTMI.g.main.clockZone.notNil and: { 25 | NTMI.g.main.clockZone.isClosed.not }) { 26 | "clock: using existing view...".postln; 27 | NTMI.g.clok.zone = NTMI.g.main.clockZone; 28 | NTMI.g.clok.extent = NTMI.g.clok.zone.bounds.extent; 29 | } { 30 | var w; 31 | NTMI.g.clok.extent = 236@126; // same size; 32 | w = Window("clock", NTMI.g.clok.extent).front; 33 | "clock: making view".postln; 34 | NTMI.g.clok.zone = w.view; 35 | }; 36 | 37 | NTMI.g.clok.uv = UserView( 38 | NTMI.g.clok.zone, 39 | NTMI.g.clok.extent * [1, 0.5] 40 | ); 41 | //.background_(Color.rand) 42 | NTMI.g.clok.uv.drawFunc_({ |uv| 43 | var timeStr = Tdef(\clocK).get(\timeStr); 44 | var font = Font(Font.defaultMonoFace, 12); 45 | var strBounds = timeStr.bounds(font); 46 | font.size_((font.size * (uv.bounds.width * 0.9 / strBounds.width)).round); 47 | Pen.stringCenteredIn(timeStr, uv.bounds, font, Color.white) 48 | }); 49 | 50 | NTMI.g.clok.but = Button( 51 | NTMI.g.clok.zone, 52 | NTMI.g.clok.uv.bounds.top_(NTMI.g.clok.extent.y * 0.5) 53 | ) 54 | //.background_(Color.rand) 55 | .states_([ 56 | ["Reset Clock", Color.white, Color.grey(0.3, 0.3)], 57 | ]).font_(NTMI.g.fontMid) 58 | .action_({ 59 | Tdef(\clocK).set(\runtime, 0, \isRunning, true).stop.play 60 | }); 61 | 62 | Tdef(\clocK).clock = SystemClock; 63 | Tdef(\clocK).addSpec(\runtime, [0, 10000, \lin, 1]); 64 | Tdef(\clocK).set(\runtime, 0, \isRunning, true); 65 | Tdef(\clocK).set(\timeStr, "00:00:00"); 66 | 67 | Tdef(\clocK, { |envir| 68 | var dt = 1; 69 | inf.do { |i| 70 | envir.timeStr = envir.runtime.asTimeString.drop(-4); 71 | defer { try { NTMI.g.clok.uv.refresh } }; 72 | 73 | dt.wait; 74 | if (envir.isRunning == true) { 75 | envir.runtime = envir.runtime ? 0 + dt; 76 | } { 77 | envir.runtime = 0; 78 | }; 79 | 80 | } 81 | }).play; 82 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/mainFXBut.scd: -------------------------------------------------------------------------------- 1 | if (NTMI.g.main.fxZone.isNil or: { 2 | NTMI.g.main.fxZone.isClosed }) { 3 | var w = Window("mainFXBut", Rect(0, 0, 394.0, 79.0)).front; 4 | NTMI.g.main.fxZone = w.view; 5 | }; 6 | 7 | NTMI.g.main.mfxBut = Button( 8 | NTMI.g.main.fxZone, 9 | NTMI.g.main.fxZone.bounds.extent 10 | ).states_([ 11 | ["MainFX\n<< RAND >>", Color.white, NTMI.g.butGrey], 12 | ]).font_(NTMI.g.font) 13 | 14 | .mouseDownAction_({ |bt, x, y, mod| 15 | var zone = x div: (bt.bounds.width div: 3); 16 | var stepVal = [-1, nil, 1][zone]; 17 | MFdef('mainPreStep').value(stepVal); 18 | // [bt, x, y, mod].postcs; 19 | }); 20 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/mainVol.scd: -------------------------------------------------------------------------------- 1 | // ** mainVol view 2 | 3 | var g = NTMI.g; 4 | 5 | if (g.main.mainVolZone.isNil or: { 6 | g.main.mainVolZone.isClosed }) { 7 | // make a test window 8 | var w = Window("mainVol", Rect(0, 0, 394.0, 79.0)).front; 9 | g.main.mainVolZone = w.view; 10 | }; 11 | 12 | g.main.mainSl = MView( 13 | 0.5, 14 | NTMI.g.main.mainVolZone, 15 | NTMI.g.main.mainVolZone.bounds.extent.asRect, 16 | MFdef(\mainVolGet).value.unbubble, 17 | g.main.w 18 | ); 19 | 20 | g.main.mainSl.uv.alpha_(0.7).refresh; 21 | g.main.mainSl.label_(\mainVol); 22 | g.main.mainSl.dict[\knobCol] = Color.grey(0, 0.7); 23 | g.main.mainSl.dict.round_(1/100); 24 | g.main.mainSl.dict.font_(g.font); 25 | 26 | g.main.mainSl.drawFunc.add(\label, { 27 | Pen.stringCenteredIn( 28 | g.main.mainSl.label, 29 | g.main.mainSl.bounds.moveTo(0,0), 30 | NTMI.g.fontFat, 31 | Color.blue 32 | ) 33 | }); 34 | 35 | g.main.mainSl.dict[\focusCol] = Color.grey(1.0, 0.8); 36 | g.main.mainSl.dict[\backCol] = Color.grey(1.0, 0.6); 37 | g.main.mainSl.uv.focus(true).refresh; 38 | 39 | 40 | if (NTMI.usesMainFX) { 41 | g.main.mainSl.putDict(\myspec, [0, 4, \amp]); 42 | g.main.mainSl.action.add(\setMain, { |mv| 43 | MFdef(\mainVol).(mv.value); 44 | }); 45 | g.main.updateMainVol = { 46 | var nuval = MFdef(\mainVolGet).value.unbubble ? 1; 47 | if (g.main.mainSl.value != nuval) { 48 | g.main.mainSl.value = nuval 49 | }; 50 | }; 51 | } { 52 | g.main.mainSl.putDict(\myspec, \mainVolS.asSpec); 53 | g.main.mainSl.action.add(\setMain, { |mv| 54 | s.volume.volume = mv.value; 55 | }); 56 | g.main.updateMainVol = { 57 | var nuval = s.volume.volume; 58 | if (g.main.mainSl.value != nuval) { 59 | g.main.mainSl.value = nuval 60 | }; 61 | }; 62 | }; 63 | 64 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/meter.scd: -------------------------------------------------------------------------------- 1 | // ServerMeter does not scale at all... 2 | // put it in its own window? 3 | 4 | NTMI.g.main.meterWidth = ServerMeterView.getWidth( 5 | NTMI.numIns ? NTMI.numChans, 6 | s.options.numOutputBusChannels 7 | ); 8 | 9 | // try to center it, but keep outside scope view 10 | NTMI.g.main.meterLeft = (NTMI.g.main.w.bounds.width - NTMI.g.main.meterWidth div: 2).max(400); 11 | 12 | NTMI.g.main.meter = ServerMeterView(s, 13 | NTMI.g.main.w, 14 | NTMI.g.main.meterLeft@0, 15 | max(NTMI.numIns, s.options.numInputBusChannels), 16 | max(NTMI.numChans, s.options.numOutputBusChannels) 17 | ); 18 | 19 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/nUFOInfo.scd: -------------------------------------------------------------------------------- 1 | var font = NTMI.g.font; 2 | var nUFOZone = NTMI.g.main.nUFOZone; 3 | var bounds = nUFOZone.bounds; 4 | var hi = bounds.height; 5 | var uvRect = bounds.extent.asRect.height_(hi * 0.5); 6 | var caliRect = bounds.extent.asRect.top_(hi * 0.5).height_(hi * 0.3); 7 | var n2iRect = bounds.extent.asRect.top_(hi * 0.8).height_(hi * 0.2); 8 | 9 | var nUFOView = UserView(nUFOZone, uvRect) 10 | .background_(NTMI.g.butGrey); 11 | NTMI.g.main.nUFOView = nUFOView; 12 | 13 | nUFOView.drawFunc_({ |uv| 14 | var bounds = uv.bounds.extent.asRect; 15 | Pen.addRect(bounds).color_(Color.white).stroke; 16 | Pen.addRect(bounds.copy.width_(bounds.width * (NTMI.nUFO.bat.percent ? 0 * 0.01))); 17 | Pen.color_(Color.green(0.75, 0.8)).fill; 18 | Pen.stringCenteredIn( 19 | (NTMI.wifiStr ? "wifi ?") 20 | ++ "\n" ++ (NTMI.nUFO.frame.rateStr ? "nUFO rate ?") 21 | ++ "\n" ++ (NTMI.nUFO.bat.string ? "nUFO bat ?"), 22 | bounds, 23 | font, 24 | Color.white 25 | ); 26 | 27 | }); 28 | 29 | NTMI.g.main.caliBut = Button(nUFOZone, caliRect) 30 | .states_([ 31 | ["CALIBRATE\ntouch + move?", Color.white, NTMI.g.butGrey], 32 | ["CALIBRATING\ntouch + move", Color.black, Color.yellow(1.0, 0.8)], 33 | ["touch + move\ncalibrated", Color.white, NTMI.g.butGrey], 34 | 35 | ]).font_(font) 36 | .action_({ |but| 37 | but.value_(1); 38 | NTMI.nUFO.calibrate(1, { |ok| but.value_(if (ok, 2, 0)) }) 39 | }); 40 | 41 | ( 42 | NTMI.g.main.nUFO2InfBut = Button(nUFOZone, n2iRect) 43 | .states_([ 44 | ["nUFO->influx is OFF", Color.black, NTMI.g.butGrey], 45 | ["nUFO->influx is ON", Color.black, Color.green(0.7, 0.7)] 46 | ]).front.font_(Font(NTMI.g.fontName, NTMI.g.font.size * 0.7)) 47 | .value_(1) 48 | .action_({ |bt| 49 | var funcs = [\imu, \caps].collect { |key| 50 | MKtl(\nUFO).device.oscFuncDictionary[key] 51 | }; 52 | if (bt.value == 0) { funcs.do(_.disable) } { funcs.do(_.enable) }; 53 | NTMI.g.main.nUFO2InfBut.value; 54 | }); 55 | ) 56 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/recButs.scd: -------------------------------------------------------------------------------- 1 | var zone = NTMI.g.main.recZone; 2 | var bounds = zone.bounds; 3 | var height = bounds.height; 4 | 5 | NTMI.g.main.recBut = Button(zone, 6 | Rect(0,0, bounds.width, height * 0.5) 7 | ).states_([ 8 | ["RECORD?", Color.white, NTMI.g.butGrey], 9 | ["Recording!", Color.black, NTMI.g.butGreen] 10 | ]).font_(NTMI.g.fontMid) 11 | .action_({ |bt| 12 | if (bt.value > 0) { 13 | // use custom record function! 14 | NTMI.record; 15 | } { 16 | s.stopRecording; 17 | } 18 | }); 19 | 20 | Button(zone, 21 | Rect(0, height * 0.5, bounds.width, height * 0.5) 22 | ).states_([ 23 | ["show recordings", Color.white, NTMI.g.butGrey] 24 | ]).font_(NTMI.g.font) 25 | .action_({ |bt| 26 | Platform.recordingsDir.openOS; 27 | }); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/subsParts/stetho.scd: -------------------------------------------------------------------------------- 1 | // rescale stethoscope height 2 | 3 | var stethoBounds = NTMI.g.main.stethoBounds; 4 | 5 | // stetho needs to be in a new-style layout for resizing... 6 | try { NTMI.g.main.stetho.view.remove }; 7 | NTMI.g.main.stetho = Stethoscope(s, NTMI.numChans, view: NTMI.g.main.w.view); 8 | 9 | // only rescales height, leaves topLine alone 10 | NTMI.g.scaleStetho = { |g, stetho, height = 230| 11 | var scopeV = stetho.scopeView; 12 | var yzoomSl = stetho.view.children[5]; 13 | var cycleSl = stetho.view.children[6]; 14 | var deltaHeight = (cycleSl.bounds.bottom - height); 15 | scopeV.bounds = scopeV.bounds.height_(scopeV.bounds.height - deltaHeight); 16 | cycleSl.bounds = cycleSl.bounds.top_(cycleSl.bounds.top - deltaHeight); 17 | yzoomSl.bounds = yzoomSl.bounds.height_(height - 30 - 20); 18 | }; 19 | 20 | // resize quick and dirty 21 | defer ({ 22 | NTMI.g.main.stetho.view.bounds_(stethoBounds); 23 | NTMI.g.scaleStetho(NTMI.g.main.stetho, stethoBounds.height - 4); 24 | 25 | }, 0.1); 26 | 27 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/8_GUIs/warnWin.scd: -------------------------------------------------------------------------------- 1 | 2 | NTMI.q.warnWin = { |q, string="?!?", title="?!?"| 3 | var w = Window("Warning: %".format(title)).front.alwaysOnTop_(true); 4 | var tv = StaticText(w, w.view.bounds); 5 | tv.background_(Color(1, 0.75)); 6 | tv.align_(\center); 7 | w.alpha_(0.9); 8 | tv.string_(string).font_(Font(Font.defaultMonoFace, 24)); 9 | }; 10 | 11 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/HOW_TO_PERSONALIZE/3a_userDir_POOL.scd: -------------------------------------------------------------------------------- 1 | *** HOW_TO_PERSONALIZE - 3a user_POOL.scd 2 | 3 | // The userPOOL folder is the best place to keep all the resources 4 | // you want to use with NTMI, so you can personalize it to your wishes. 5 | // It is located here: 6 | 7 | NTMI.dir.userPOOL 8 | NTMI.dir.userPOOL.openOS 9 | 10 | /* 11 | It has several subfolders for code files with customized: 12 | server setups, 13 | sound processes and setups, 14 | interfaces to connect, 15 | effects patches to add, 16 | and startup file examples. 17 | 18 | So far, this is used to choose the sound processes you want to use. 19 | By default, NTMI loads all sound processes in ... /2_process/: 20 | */ 21 | 22 | (NTMI.dir.userPOOL +/+ "/2_process/*.scd").pathMatch.printAll.size; 23 | 24 | // You can set these by hand in your startup file, 25 | // before you run NTMI, e.g. load just these ndefs: 26 | NTMI.process.namesToLoad = [ 27 | 'bleepo', 'filterFB', 'granbuf', 'formSing', 28 | 'beatX', \revFB, 'rjkChaos', 'varsawFB', 'xFMSH', 29 | ]; 30 | 31 | // you can also set which presets some processes should load 32 | NTMI.initialPresetNames = [ 33 | 'bleepo' -> 'vocca', 34 | 'xFMSH' -> 'border', 35 | \revFB -> \slolo, 36 | 'rjkChaos' -> 89, // can also be an index number 37 | // or a function that generates an index number: 38 | \robTron -> { |pre| 2000.rand }, 39 | ]; 40 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/HOW_TO_PERSONALIZE/3b_adding_sound_processes.scd: -------------------------------------------------------------------------------- 1 | // Adding sound processes: 2 | // 3 | // You can add your own sound processes by making a codefile 4 | // with an Ndef and the parameter ranges it needs; 5 | // NTMI knows how to tie it into the system when you 6 | // put that file into "~/NTMI/POOL/2_process/". 7 | /* 8 | Ndef(\abc).gui; 9 | */ 10 | 11 | // Here is a very simple example: 12 | // define parameter ranges first 13 | Ndef(\abc).addSpec (\pulsefreq, [20, 2000, \exp]); // 14 | Ndef(\abc).addSpec (\modRate, [0.2, 20, \exp]); // 15 | Ndef(\abc).addSpec (\fmodDepth, [0, 12, \amp]); // 16 | Ndef(\abc).addSpec (\wmodDepth, [0, 1, \amp]); // 17 | Ndef(\abc).addSpec (\passprob, [0.04, 1, \exp]); // 18 | Ndef(\abc).addSpec (\pan, \pan); // range -1, 1 19 | 20 | // then the sound process as an Ndef: 21 | // by convention, the first parameter must be amp! 22 | Ndef(\abc, { |amp = 0.25, 23 | pulsefreq = 60, modRate = 10, fmodDepth, wmodDepth, 24 | passprob = 0.25| 25 | // sound design here 26 | var snd = Pulse.ar( 27 | pulsefreq.lag(0.3) 28 | * LFDNoise3.kr(modRate!2, fmodDepth).midiratio, 29 | LFDNoise3.kr(modRate!2), 30 | ); 31 | var passAmp = Latch.ar(CoinGate.ar(passprob, snd), snd); 32 | snd * passAmp * amp; 33 | }); 34 | 35 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/HOW_TO_PERSONALIZE/5_Adding_soundfiles.scd: -------------------------------------------------------------------------------- 1 | /*** Use your own soundfiles ****/ 2 | 3 | /// NTMI has a folder with example soundfiles 4 | // in the quark folder: 5 | (NTMI.dir.setup +/+ "soundfiles").openOS; 6 | 7 | // this folder is automagically copied to the user dir: 8 | (NTMI.dir.user +/+ "soundfiles").openOS; 9 | NTMI.dir.userSoundfiles.openOS; 10 | 11 | // By default, NTMI loads these soundfiles into buffers, 12 | // and puts them in a dictionary called q.bufs, 13 | // under the name 'global': 14 | q.bufs.global; 15 | q.bufs.global.choose.play; 16 | 17 | // you can put multiple collections of soundfiles 18 | // into this userDir, and load them into q.bufs with this function: 19 | MFdef(\bufLoad).((NTMI.dir.userSoundfiles +/+ "/myfavorites/")); 20 | // then they are available by name, such as 21 | q.bufs.myfavorites; 22 | q.bufs.myfavorites.choose.play; 23 | 24 | // Currently the sound processes that use buffers are: 25 | Ndef(\granbuf) 26 | Ndef(\bufRd) 27 | 28 | // You can switch the buffers to use in an Ndef like this: 29 | // arguments are: which ndefs should use them, and name the buffers to use: 30 | MFdef(\bufSetRange).([Ndef(\granbuf), Ndef(\bufRd)], q.bufs.global); 31 | MFdef(\bufSetRange).([Ndef(\granbuf), Ndef(\bufRd)], q.bufs.myfavorites); 32 | 33 | // to see how to write an Ndef that uses this, see Ndef(\granbuf) 34 | Document.open(NTMI.process.procPath.replace("*", "granbuf")); 35 | 36 | 37 | // Ndef(\wsetta) uses soundfiles based on WavesetsEvents, 38 | // and stores them in its own NTMI dict, at 39 | NTMI.wse; 40 | NTMI.wse.keys; 41 | NTMI.wse.soundfiles; 42 | NTMI.wse.wses; 43 | 44 | // To load your preferred soundfiles for Wavesets/wsetta use, do: 45 | NTMI.wse.loadWSEs(NTMI.dir.userSoundfiles +/+ "myfavorites"); 46 | 47 | NTMI.wse.soundfiles.choose.play; 48 | NTMI.wse.wses; 49 | 50 | // ToDo: it should be easy to keep muliple lists of wavesets 51 | // loaded and switchable, as with q.bufs. -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/HOW_TO_PERSONALIZE/howto_make_saySoundfiles.scd: -------------------------------------------------------------------------------- 1 | // How the soundfiles for granbuf were made: 2 | /* needs the Quark say, which is macOS only 3 | if (Quarks.installed.any { |qk| qk.name == "say" }.not) { 4 | Quarks.install("say"); 5 | }; 6 | */ 7 | // make the soundfiles 8 | [ "Airborne_Instruments", "nUFO", "N_T_M_I" ].do { |txt| 9 | SayBuf.prepare((text: txt, lang: \en)) 10 | }; 11 | // find them here - copy them to where you need them 12 | SayBuf.dir.openOS; 13 | 14 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/1_server_setups/serverBasic2.scd: -------------------------------------------------------------------------------- 1 | // 2 | // "\n********** loading serverConfig: **********".postln; 3 | 4 | // tweak server latency for fast response and rare "late" complaints: 5 | // default latency is 0.2 secs, which feels slow when playing; 6 | // less than 0.03 may introduce many late messages from server. 7 | // latency nil means do things immediately, but will compromise timing: 8 | // it quantizes to the hardwareBufferSize border. 9 | 10 | s.latency = 0.05; 11 | 12 | // // Hardware setup first: 13 | 14 | /* // could check which devices are found: 15 | ServerOptions.devices.postcs 16 | */ 17 | 18 | 19 | // "Setting server options: ".postln; 20 | if (s.serverRunning) { 21 | q.warnWin( 22 | "Server options are being set when s is running already!" 23 | " Settings will not take effect until server is rebooted:".warn, 24 | "\ns.reboot;", 25 | "Server options!" 26 | ); 27 | }; 28 | 29 | /////// set to a specific device here by name 30 | // s.options.device_("RME Babyface"); 31 | 32 | // set number of hardware input and output bus channels 33 | s.options.numInputBusChannels_(2); // 34 | s.options.numOutputBusChannels_(2); // 35 | // set control rate blockSize, default 64 samples 36 | s.options.blockSize_(64); 37 | // set hardwareBufferSize to lowest power of two hardware allows before glitching 38 | s.options.hardwareBufferSize_(64*2); 39 | 40 | // reserve enough realtime memory (in kiloBytes) for delay lines etc 41 | s.options.memSize_(8192 * 16); 42 | 43 | ///// set plugins path to very self-contained: read all internal plugins 44 | ///// PLUS any plugins found in the Standalone's internal Extensions dir: 45 | ///// so if we use any sc3-plugins, put them there ... 46 | if (\Standalone.asClass.notNil) { 47 | "Standalone, so using special ugenPluginsPath:".postln; 48 | s.options.ugenPluginsPath = 49 | ([ Platform.resourceDir +/+ "plugins" ] 50 | ++ [\Standalone.asClass.internalExtDir]).join($:).postcs; 51 | } { 52 | "no standalone, using default ugenPluginsPath."; 53 | }; 54 | 55 | // recording options: 56 | s 57 | .recChannels_(q.numChans ? 2) // record numChans 58 | .recSampleFormat_("float"); // in float to recover from clipping 59 | 60 | "\n/// to see server settings, do: \nq.postServerOptions;".postln; 61 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/1_server_setups/serverBasic8.scd: -------------------------------------------------------------------------------- 1 | // same as basic2 but 8 channels and less commentary: 2 | 3 | s.latency = 0.05; 4 | 5 | // // Hardware setup first: 6 | /* // could check which devices are found: 7 | ServerOptions.devices.postcs 8 | */ 9 | 10 | // "Setting server options: ".postln; 11 | if (s.serverRunning) { 12 | q.warnWin( 13 | "Server options are being set when s is running already!" 14 | " Settings will not take effect until server is rebooted:".warn, 15 | "\ns.reboot;", 16 | "Server options!" 17 | ); 18 | }; 19 | 20 | /////// set to a specific device here by name 21 | // s.options.device_("Fireface 400 (297)"); 22 | 23 | // set number of hardware input and output bus channels 24 | s.options.numInputBusChannels_(8); // 25 | s.options.numOutputBusChannels_(8); // 26 | 27 | s.options.blockSize_(64); 28 | s.options.hardwareBufferSize_(64*2); 29 | 30 | s.options.memSize_(8192 * 16); 31 | 32 | ///// If Standalone, set plugins path to very self-contained: read all internal plugins 33 | ///// PLUS any plugins found in the Standalone's internal Extensions dir: 34 | ///// so if we use any sc3-plugins, put them there ... 35 | if (\Standalone.asClass.notNil) { 36 | "Standalone, so using special ugenPluginsPath:".postln; 37 | s.options.ugenPluginsPath = 38 | ([ Platform.resourceDir +/+ "plugins" ] 39 | ++ [\Standalone.asClass.internalExtDir]).join($:).postcs; 40 | } { 41 | "no standalone, using default ugenPluginsPath."; 42 | }; 43 | 44 | // recording options: 45 | s 46 | .recChannels_(q.numChans ? 8) // record numChans 47 | .recSampleFormat_("float"); // in float to recover from clipping 48 | 49 | "\n/// to see server settings, do: \nq.postServerOptions;".postln; 50 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/allArm.scd: -------------------------------------------------------------------------------- 1 | // nonstandard synthesis hoelzl style 2 | // hh beijing 2005- 3 | // made quad/MC 2019 4 | q=q?(); 5 | q.numChans = q.numChans ? 2; 6 | 7 | Ndef(\allArm).addSpec(\topfreq, [20, 100000, \exp, 1]); 8 | Ndef(\allArm).addSpec(\filtfreq, [8, 100000, \exp, 1]); 9 | Ndef(\allArm).addSpec(\divefreq, [0.05, 20, \exp, 0.01]); 10 | 11 | // basic mapping notes 12 | Ndef(\allArm).addHalo(\gamePadMap, ( 13 | joyLX: \topfreq, 14 | joyLY: \divefreq, 15 | joyRX: \filtfreq, 16 | joyRY: \amp) 17 | ); 18 | 19 | 20 | Ndef(\allArm, { arg amp=0, divefreq=0.2, topfreq= 10000, filtfreq=20; 21 | var mintime, source; 22 | mintime = (LFDNoise0.kr(20! q.numChans, 0.5, 1) * topfreq).reciprocal; 23 | source = LeakDC.ar( 24 | CombN.ar( 25 | Decay.ar( 26 | Dust.ar(0.6 ! q.numChans, 1) + BrownNoise.ar(0.0005), 27 | 0.2, 28 | WhiteNoise.ar(1 ! q.numChans) * LFDNoise0.kr(0.4, 0.5, 0.5) 29 | ), 30 | 2.2, 31 | (SinOsc.kr(divefreq, 0.2, 0.7, 0.7) 32 | + LFDNoise3.kr(divefreq * 2.6, 0.4, 0.0)).max(mintime).min(2.2), 33 | 1 34 | ) 35 | ); 36 | Sanitize.ar( 37 | Limiter.ar( 38 | OnePole.ar(([ HPF.ar(source, filtfreq), LPF.ar(source, filtfreq, 4) ].sum * amp).distort, 0.2), 39 | 0.7 40 | ) 41 | ); 42 | }); 43 | 44 | /* tests 45 | Ndef(\allArm).gui; 46 | Ndef(\allArm).play; 47 | 48 | Ndef(\allArm).vol_(0.1); 49 | Ndef(\allArm).set(\filtfreq, 200); 50 | Ndef(\allArm).set(\topfreq, 200); 51 | Ndef(\allArm).set(\divefreq, 1); 52 | */ 53 | 54 | /* old gamepad mapping, for reference 55 | GamePad.putProxy(5, \s5_allArm, 56 | ( 57 | joyRY: { arg val; ~s5_allArm.set(\amp, \amp.asSpec.map(val) ) }, 58 | joyLX: { arg val; ~s5_allArm.set(\topfreq, \topfreq.asSpec.map(val)) }, 59 | joyLY: { arg val; ~s5_allArm.set(\divefreq, \divefreq.asSpec.map(val)) }, 60 | joyRX: { arg val; ~s5_allArm.set(\filtfreq, \filtfreq.asSpec.map(val)) } 61 | ) 62 | ); 63 | */ 64 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/backupsORIGs/allArm_ORIG.scd: -------------------------------------------------------------------------------- 1 | // nonstandard synthesis hoelzl style 2 | // hh beijing 2005- 3 | // made quad/MC 2019 4 | q=q?(); 5 | q.numChans = q.numChans ? 2; 6 | 7 | Ndef(\allArm, { arg amp=0, divefreq=0.2, topfreq= 10000, filtfreq=20; 8 | var mintime, source; 9 | mintime = (LFDNoise0.kr(20! q.numChans, 0.5, 1) * topfreq).reciprocal; 10 | source = LeakDC.ar( 11 | CombN.ar( 12 | Decay.ar( 13 | Dust.ar(0.6 ! q.numChans, 1) + BrownNoise.ar(0.0005), 14 | 0.2, 15 | WhiteNoise.ar(1 ! q.numChans) * LFDNoise0.kr(0.4, 0.5, 0.5) 16 | ), 17 | 2.2, 18 | (SinOsc.kr(divefreq, 0.2, 0.7, 0.7) 19 | + LFDNoise3.kr(divefreq * 2.6, 0.4, 0.0)).max(mintime).min(2.2), 20 | 1 21 | ) 22 | ); 23 | Sanitize.ar( 24 | Limiter.ar( 25 | OnePole.ar(([ HPF.ar(source, filtfreq), LPF.ar(source, filtfreq, 4) ].sum * amp).distort, 0.2), 26 | 0.7 27 | ) 28 | ); 29 | }); 30 | 31 | Ndef(\allArm).addSpec(\topfreq, [20, 100000, \exp, 1]); 32 | Ndef(\allArm).addSpec(\filtfreq, [8, 100000, \exp, 1]); 33 | Ndef(\allArm).addSpec(\divefreq, [0.05, 20, \exp, 0.01]); 34 | 35 | // basic mapping notes 36 | Ndef(\allArm).addHalo(\gamePadMap, ( 37 | joyLX: \topfreq, 38 | joyLY: \divefreq, 39 | joyRX: \filtfreq, 40 | joyRY: \amp) 41 | ); 42 | 43 | fork { s.sync; 0.1.wait; Ndef(\allArm).end }; 44 | 45 | Ndef(\allArm); 46 | 47 | /* tests 48 | Ndef(\allArm).gui; 49 | Ndef(\allArm).play; 50 | 51 | Ndef(\allArm).vol_(0.1); 52 | Ndef(\allArm).set(\filtfreq, 200); 53 | Ndef(\allArm).set(\topfreq, 200); 54 | Ndef(\allArm).set(\divefreq, 1); 55 | */ 56 | 57 | /* old gamepad mapping, for reference 58 | GamePad.putProxy(5, \s5_allArm, 59 | ( 60 | joyRY: { arg val; ~s5_allArm.set(\amp, \amp.asSpec.map(val) ) }, 61 | joyLX: { arg val; ~s5_allArm.set(\topfreq, \topfreq.asSpec.map(val)) }, 62 | joyLY: { arg val; ~s5_allArm.set(\divefreq, \divefreq.asSpec.map(val)) }, 63 | joyRX: { arg val; ~s5_allArm.set(\filtfreq, \filtfreq.asSpec.map(val)) } 64 | ) 65 | ); 66 | */ 67 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/backupsORIGs/formSingOriG.scd: -------------------------------------------------------------------------------- 1 | // Blip thru Formlet, pseudo-vocal synthesis. 2 | // hh&adc, since beijing 2005 3 | // 2019 made quad/MC 4 | 5 | // keywords: vocal, voice, formants 6 | 7 | /* 8 | Ndef(\formSing).gui; 9 | Ndef(\formSing).play; 10 | Ndef(\formSing).getHalo(\stepFdev).value; 11 | */ 12 | Ndef(\formSing).addSpec(\root, [20, 500, 6]); 13 | Ndef(\formSing).addSpec(\formfrq, [50, 5000, \exp]); 14 | Ndef(\formSing).addSpec(\harm, [1, 256, \exp]); 15 | Ndef(\formSing).addSpec(\formLag, [0.01, 100, \exp]); 16 | Ndef(\formSing).addSpec(\ndiv, [0.01, 1, \exp]); 17 | Ndef(\formSing).addSpec(\fdev, [0, 24, \amp]); 18 | Ndef(\formSing).addSpec(\round, [0, 3, \amp, 0.05]); 19 | 20 | ( 21 | // modulating formant frequency 22 | Ndef(\formSing, { arg amp=0, root=150, formfrq=500, harm=20, fdev=2, ndiv = 0.2, formLag=0.1, round = 1.5; 23 | var freqCompare = 1; // ((formfrq / root).log2).abs.min(1).linexp(0, 1, 0.25, 1); 24 | var in = Blip.ar( 25 | root.lag(formLag) * LFNoise0.kr(root * ndiv ! q.numChans, fdev.max(0.01) ).midiratio, 26 | harm.lag(formLag), // .max(formfrq / root * 0.25), 27 | 0.1 28 | ) * GrayNoise.ar(0.1 ! q.numChans, 1); 29 | 30 | Limiter.ar(Formlet.ar(in, formfrq.lag(formLag), 0.005, 0.02) * (freqCompare * amp.lag(0.1))) 31 | .softclip; 32 | }); 33 | ); 34 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/backupsORIGs/kiteHiORIG.scd: -------------------------------------------------------------------------------- 1 | // vivid noise synthesis, 2 | // hh, cologne 2003- 3 | // made MC 2019 4 | 5 | Ndef(\kiteHi, { arg amp=0, ffreq=12000, move = 0.2, hack=3, dustfreq=100, width=0.3, lag=0.25; 6 | var n=5; 7 | var snd = ({ 8 | var in = LFClipNoise.ar(dustfreq.lag(lag), LFPulse.ar( hack * Rand(0.5, 2), Rand(0, 2pi), width+Rand(-0.3, 0.4)) ); 9 | Ringz.ar(in, 10 | ffreq.lag(lag) * LFDNoise1.kr(move-0.05, 0.95, 1), 11 | 1.25/hack 12 | ) 13 | } ! n) 14 | .clump( q.numChans ).sum; 15 | 16 | (LPF.ar(snd, 400) + HPF.ar(snd, 400, 0.33)).softclip * (amp * 0.25).lag(0.03); 17 | }); 18 | 19 | 20 | Ndef(\kiteHi).addSpec(\ffreq, [-1000, 30000, \lin]); 21 | Ndef(\kiteHi).addSpec(\move, [0.05, 40, \exp]); 22 | Ndef(\kiteHi).addSpec(\hack, [1, 40, \exp]); 23 | Ndef(\kiteHi).addSpec(\dustfreq, [0.20, 100000, \exp]); 24 | Ndef(\kiteHi).addSpec(\width, [0.01, 1.0, \amp]); 25 | Ndef(\kiteHi).addSpec(\lag, [0, 4.0, 5]); 26 | 27 | Ndef(\kiteHi).addHalo(\ffreq, [-1000, 30000, \lin]); 28 | 29 | 30 | Ndef(\kiteHi).addHalo(\stepDustfreq, { arg val; var curr; 31 | var nd = Ndef(\kiteHi); 32 | curr = nd.get(\dustfreq); 33 | "% - \stepDustfreq: ".postf(nd); 34 | curr = if (curr < 10000, { curr * 1.618 }, 0.2).postln; 35 | nd.set(\dustfreq, curr); 36 | }); 37 | 38 | Ndef(\kiteHi).addHalo(\stepWidth, { arg val; var curr; 39 | var nd = Ndef(\kiteHi); 40 | curr = nd.get(\width); 41 | "% - \width: ".postf(nd); 42 | curr = if (curr < 1, { curr * 1.618 }, 0.01).postln; 43 | nd.set(\width, curr); 44 | }); 45 | 46 | fork { s.sync; 0.1.wait; Ndef(\kiteHi).end }; 47 | 48 | Ndef(\kiteHi); 49 | 50 | /* 51 | Ndef(\kiteHi).gui; 52 | Ndef(\kiteHi).getHalo(\stepDustfreq).value; 53 | Ndef(\kiteHi).getHalo(\stepWidth).value; 54 | */ 55 | 56 | 57 | /* // for reference, the old GamePad mappings 58 | GamePad.putProxy(7, \s7_kiteHi0, 59 | ( 60 | joyRY: { arg val; ~s7_kiteHi0.set(\amp, \amp.asSpec.map(val) ) }, 61 | joyLX: { arg val; ~s7_kiteHi0.set(\hack, \hack.asSpec.map(val)) }, 62 | joyLY: { arg val; ~s7_kiteHi0.set(\ffreq, \ffreq.asSpec.map(val)) }, 63 | joyRX: { arg val; ~s7_kiteHi0.set(\move, \move.asSpec.map(val)) }, 64 | lHat: { arg val; 65 | var curr; 66 | if (val == 0) { "kiteHi - dustfreq: ".post; 67 | curr = ~s7_kiteHi0.getKeysValues([\dustfreq])[0][1]; 68 | curr = if (curr < 10000, curr.postln * 1.618, 0.2).postln; 69 | ~s7_kiteHi0.set(\dustfreq, curr) 70 | }; 71 | }, 72 | rHat: { arg val; 73 | var curr; 74 | if (val == 0) { "s7_kiteHi0 - width: ".post; 75 | curr = ~width.getKeysValues([\rq])[0][1]; 76 | curr = if (curr < 1, curr.postln * 1.618, 0.01).postln; 77 | ~s7_kiteHi0.set(\width, curr) 78 | }; 79 | } 80 | ) 81 | ); 82 | */ 83 | 84 | /* tests 85 | 86 | ~s7_kiteHi0.filter(2, {arg in; in*5}); 87 | ~s7_kiteHi0.vol_(1); 88 | ~s7_kiteHi0.vol_(0.1); 89 | ~s7_kiteHi0.set(\filtfreq, 200); 90 | ~s7_kiteHi0.set(\topfreq, 200); 91 | ~s7_kiteHi0.set(\divefreq, 1); 92 | */ 93 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/bleepo.scd: -------------------------------------------------------------------------------- 1 | // a model of the blippoo box by rob hordijk, 2 | // with a few liberties taken: 3 | // saws can be waveshaped, 4 | // sound is stereo, (shift shifts cycles between left and right) 5 | 6 | ( 7 | q = q ? (); 8 | 9 | Ndef(\bleepo).ar(q.numChans); 10 | 11 | Ndef(\bleepo).addSpec(\rateB, [0.01, 5000, \exp]); 12 | Ndef(\bleepo).addSpec(\rateA, [0.01, 5000, \exp]); 13 | Ndef(\bleepo).addSpec(\peak1, \freq); 14 | Ndef(\bleepo).addSpec(\peak2, \freq); 15 | Ndef(\bleepo).addSpec(\fm_b2a, \amp); 16 | Ndef(\bleepo).addSpec(\fm_a2b, \amp); 17 | Ndef(\bleepo).addSpec(\sh2Filt, \pan); 18 | Ndef(\bleepo).addSpec(\sh2RateA, \pan); 19 | 20 | Ndef(\bleepo).addSpec(\rezo, [1, 100, \exp, 0.1]); 21 | Ndef(\bleepo).addSpec(\dens, [0.00001, 1, \exp, 0.00001]); 22 | Ndef(\bleepo).addSpec(\ramp, [100, 30000, \exp, 1]); 23 | 24 | Ndef(\bleepo).addSpec(\wshape, [0.001, 0.999]); 25 | Ndef(\bleepo).addSpec(\shift, [0, 1]); 26 | 27 | 28 | Ndef(\bleepo, { arg amp = 0, 29 | rateA=0.0216, rateB=0.3, peak1=1114, peak2=77, 30 | fm_b2a=0.43, fm_a2b=0.8, sh2Filt=0.694, rezo = 29.2, 31 | dens = 0.11, wshape=0.025, sh2RateA=0.68, shift = 0.0647; 32 | 33 | var ramp = 30000; // should be lower, ca 5-7000 or so ... hmm! 34 | 35 | var waves, sha, u, o, f, r, trig, filtfreqs2, sh, shf, rungler1, rungler2; 36 | var midfreq, maxfreq; 37 | var in = LocalIn.ar(3); 38 | var oscfreqs2 = ([in[2] * rateA, rateB] 39 | * in.keep(2).reverse.madd([fm_b2a,fm_a2b]) 40 | .linexp(-1,1, 1/18, 18) 41 | ).fold(0.01, 19000); 42 | 43 | rezo = rezo.reciprocal; 44 | 45 | waves = VarSaw.ar(oscfreqs2, 0, [wshape, 1 - wshape]); 46 | 47 | maxfreq = oscfreqs2[0].max(oscfreqs2[1]); 48 | 49 | trig = waves[0].absdif((waves[1] + [0, shift]).wrap(-1, 1)) < dens; 50 | trig = Trig.ar(trig, 0.0); 51 | 52 | u = Decay2.ar(trig, 0/maxfreq, 0.1/maxfreq); 53 | u = ToggleFF.ar(trig); 54 | 55 | sh = Latch.ar(waves, trig); // -1, 1 56 | shf = ( 10 ** (sh.abs * sh2Filt.squared * sh2Filt.sign)); 57 | sha = ( 10 ** (sh.abs * sh2RateA.cubed.abs * sh2RateA.sign)); 58 | 59 | filtfreqs2 = Fold.ar(( [ peak1 * shf, peak2 * (shf ** -1)]), 20, 19000); 60 | f = RHPF.ar(u, Slew.ar(filtfreqs2[0], ramp, ramp), rezo) 61 | - RHPF.ar(u, Slew.ar(filtfreqs2[1], ramp, ramp), rezo); 62 | 63 | LocalOut.ar(waves ++ [sha] ); 64 | f = Limiter.ar(f * 0.4, 1, 0.01) * amp; 65 | 66 | f.collect{|si, i| 67 | PanAz.ar(q.numChans, si, SinOsc.kr(Rand(0.1, 0.2)/2, 0, Rand(1, 2)), amp) 68 | }.sum; 69 | 70 | }); 71 | ); 72 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/brushes.scd: -------------------------------------------------------------------------------- 1 | Ndef(\brushes).addSpec(\rabisco, [1, 40, \exp]); 2 | Ndef(\brushes).addSpec(\trig, [1.0, 10, \lin, 0.1]); 3 | Ndef(\brushes).addSpec(\cf, [80, 1600, \exp]); 4 | Ndef(\brushes).addSpec(\rq, [0.2, 12, \exp]); 5 | 6 | ( 7 | Ndef(\brushes, {|amp, rabisco=4, trig=4, cf=400, rq=0.2| 8 | var tri, sig, modulator, papel, env; 9 | modulator = LFNoise2.kr( 10 | rabisco + LFNoise1.kr(rabisco.reciprocal).lag(rabisco.reciprocal)); 11 | cf = cf + LFNoise2.kr(0.5, rabisco); 12 | rq = (rq + LFNoise2.kr(1,rq).lag2(0.5))/2; 13 | tri = Dust.kr(trig); 14 | env = Env( 15 | [0.001, TRand.kr(0.001,1,tri), TRand.kr(0.001,1,tri), 16 | TRand.kr(0.001,1,tri), 0.001], 17 | [TRand.kr(0.1,0.25,tri), TRand.kr(0.1,0.25,tri), 18 | TRand.kr(0.1,0.25,tri), TRand.kr(0.1,0.25,tri)], 19 | [TRand.kr(-5.0,5.0,tri), TRand.kr(-5.0,5.0,tri), 20 | TRand.kr(-5.0,5.0,tri), TRand.kr(-5.0,5.0,tri)] 21 | ); 22 | papel = EnvGen.kr(env, tri); 23 | sig = WhiteNoise.ar() * modulator * papel * amp; 24 | sig = BPF.ar(sig, 25 | cf.lag(0.5), 26 | rq.lag(0.5) 27 | ); 28 | sig = Pan2.ar(sig, LFNoise2.kr(trig/5+(rabisco/5), 0.8)); 29 | sig = Compander.ar(sig, sig, 1, 0.75, 0.25, 0.002); 30 | }); 31 | ); 32 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/bufRd.scd: -------------------------------------------------------------------------------- 1 | // Ndef(\bufRd).gui 2 | 3 | ( 4 | // redo \bufnum spec to use specific buffer range! 5 | Ndef(\bufRd).addSpec(\bufnum, \unipolar); 6 | Ndef(\bufRd).addHalo(\sndBufRange, [0, 0]); 7 | 8 | try { 9 | Ndef(\bufRd).addHalo(\sndBufRange, [ 10 | q.bufs.global.first.bufnum, 11 | q.bufs.global.last.bufnum ].postln 12 | ); 13 | }; 14 | 15 | 16 | Ndef(\bufRd).addSpec(\start, [0, 0.999]); 17 | Ndef(\bufRd).addSpec(\end, [0.001, 1, \exp]); 18 | Ndef(\bufRd).addSpec(\rate, [-2, 2, \lin]); 19 | Ndef(\bufRd).addSpec(\mod, [0, 1]); 20 | Ndef(\bufRd).addSpec(\modResl, [0.25, 160, \exp]); 21 | Ndef(\bufRd).addSpec(\modSpeed, [0.5, 40, \lin]); 22 | Ndef(\bufRd).addSpec(\atk, [0.001, 2, \lin]); 23 | Ndef(\bufRd).addSpec(\sustain, [0.002, 2, \lin]); 24 | Ndef(\bufRd).addSpec(\rel, [0.001, 2, \lin]); 25 | Ndef(\bufRd).addSpec(\ampenv, [0, 1, \amp]); 26 | Ndef(\bufRd).addSpec(\modRateFreq , [0.05, 20, \amp]); 27 | Ndef(\bufRd).addSpec(\pan, [-1,1]); 28 | 29 | MFdef('bufSetRange').(Ndef('bufRd'), q.bufs['global'], 'global'); 30 | 31 | Ndef(\bufRd, { | amp=1, bufnum = 0, rate=1, start=0, end=1, mod = 0, modSpeed = 1, modResl = 1, atk =0.002, sustain=1, rel=0.002, ampenv = 1, modRateFreq = 1, pan=0| 32 | 33 | var sig, buf = 0, brate, bframes, bStart, bEnd, bdur, trigg, modStart, env, modRate; 34 | 35 | var bufnum2 = bufnum.linlin(0, 1, *Ndef(\bufRd).getHalo(\sndBufRange)); 36 | 37 | modRate = { LFNoise0.kr( modRateFreq, 1, -1) * 2 * rate + 1 }!2; 38 | brate = BufRateScale.kr(bufnum2) * modRate; 39 | bframes = BufFrames.kr(bufnum2); 40 | bStart = bframes * start; 41 | bEnd = bframes * end; 42 | bdur = BufDur.kr(bufnum2); 43 | trigg = Impulse.kr(modResl); 44 | modStart = LFSaw.kr( bdur.reciprocal * modSpeed).range(bframes * start, bframes); 45 | modStart = Latch.kr( modStart, trigg ); 46 | env = EnvGen.kr( Env( [0,1,1,0],[atk,sustain,rel],[\sin,0,\sin] ), 47 | trigg, 48 | timeScale: modResl.reciprocal 49 | ).clip(1 - ampenv, 1); 50 | 51 | sig = BufRd.ar( 1, bufnum2, 52 | Phasor.ar(0, brate, 0, bframes).wrap( bStart, bEnd ) + (modStart * mod), 53 | 1, 4 ); 54 | Splay.ar(sig * env, 1, amp, pan); 55 | }) 56 | ); 57 | 58 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/cat.scd: -------------------------------------------------------------------------------- 1 | // SOUND 2 // the DubCat example from our Class: 2 | 3 | // controlspecs 4 | Ndef(\cat).addSpec(\pFreq, [20, 400, \exp]); 5 | Ndef(\cat).addSpec(\pWidth, [0.01, 0.5, \exp]); 6 | Ndef(\cat).addSpec(\filt, [1, 32, \exp]); 7 | Ndef(\cat).addSpec(\q, [1, 1000, \exp]); 8 | Ndef(\cat).addSpec(\modFreq, [0, 200, 7]); 9 | Ndef(\cat).addSpec(\moDepth, [0, 12*8]); 10 | 11 | // a Synth with 6 control parameters 12 | ( 13 | Ndef(\cat, { |amp=0, pFreq=100, modFreq=0, filt=2, q=1, pWidth=0.5, moDepth=12| 14 | var signal; 15 | var pFreqF = pFreq * 16 | [ 17 | SinOsc.ar(modFreq * 0.5 + [0, 0.1, 0.213], 0).product, 18 | SinOsc.ar(modFreq * 0.5 + [0, -0.1, 0.213], 0).product 19 | ].madd(moDepth).midiratio; 20 | signal = RLPF.ar( 21 | LFPulse.ar( 22 | pFreq * [1, 1.01], 23 | 0, 24 | LFNoise2.kr(1/20).exprange(0.02, 0.9)// pWidth 25 | ), 26 | (pFreqF * filt).clip(50, 15000), 27 | q.reciprocal 28 | ) 29 | * AmpComp.kr(pFreq.lag(1)); 30 | Limiter.ar(signal) * amp; 31 | }) 32 | ); 33 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/dog.scd: -------------------------------------------------------------------------------- 1 | // SOUND 1, from orig Influx Example 2 | ( 3 | Ndef(\dog).addSpec(\intv, [-24, 24]); 4 | Ndef(\dog).addSpec(\timescale, [0.01, 10, \exp]); 5 | Ndef(\dog).addSpec(\curve, [-10, 10]); 6 | Ndef(\dog).addSpec(\ffreq, \freq); 7 | 8 | Ndef(\dog).addSpec(\loopnode, [0, 12]); 9 | Ndef(\dog).addSpec(\dens, [10, 1000]); 10 | Ndef(\dog).addSpec(\resfreq, \freq); 11 | Ndef(\dog).addSpec(\ringtime, [0.01, 1, \exp]); 12 | 13 | Ndef(\dog, { |amp=0, freq=250, intv=19, timescale=1, curve=0, loopnode=0, dens = 10, resfreq = 500, ringtime = 0.01| 14 | var n = 15; 15 | var env = EnvGen.kr( 16 | Env({ 1.0.rand2 }!(n+1), {1.0.rand}!n, curve, releaseNode: n-1, loopNode: loopnode.min(n-3)), 17 | timeScale: timescale); 18 | var pitch = (env * [1, 0.33, -1] * intv).midiratio * freq; 19 | var form = Formant.ar(pitch, pitch.rotate(1) * 1.6, pitch.rotate(2) * 2.6); 20 | 21 | var dusty = Ringz.ar( 22 | Dust.ar(dens!3), 23 | (resfreq * LFNoise0.kr([3, 5, 7], 0.5, 1)).lag(0.3), 24 | ringtime) 25 | * ((dens ** -0.5) * (ringtime ** -0.3) 26 | ); 27 | 28 | Splay.ar(form * dusty, level: amp * 4) ; 29 | }); 30 | ); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/dynstosyn.scd: -------------------------------------------------------------------------------- 1 | // Sergio Luque, DSS patch with demand envgen 2 | // adapted for NTMI by adc, 2022 3 | // \Dynamic_Stochastic_Synthesis 4 | 5 | q = q ? (); 6 | q.numChans = q.numChans ? 2; 7 | 8 | // specifications for the GUI 9 | Ndef(\dynstosyn).addSpec(\bpRatio, [ 0, 1, \lin, 0, 0.5 ]); 10 | Ndef(\dynstosyn).addSpec(\freqA, [ 27.5, 2093, \exp, 0, 27.5 ]); 11 | Ndef(\dynstosyn).addSpec(\freqB, [ 27.5, 2093, \exp, 0, 2093 ]); 12 | Ndef(\dynstosyn).addSpec(\maxDurSt, [ 0, 1, \amp, 0, 0.1]); 13 | Ndef(\dynstosyn).addSpec(\maxAmp, [ 0.1, 1, \exp, 0, 0.1 ]); 14 | Ndef(\dynstosyn).addSpec(\maxAmSt, [ 0, 1, \amp, 0, 0.1]); 15 | Ndef(\dynstosyn).addSpec(\numBps, [ 2, 160, \exp, 1]); 16 | 17 | Ndef(\dynstosyn, 18 | {| amp = 0, bpRatio = 0.5, freqA = 27.5, freqB = 2093, maxDurSt = 0.1, maxAmp = 0.1, maxAmSt = 0.1 | 19 | var numBps, maxNumBps = 160, freqs, maxDur, minDur, maxDurStep, maxAmpStep; 20 | 21 | freqs = [ min(freqA, freqB), max(freqA, freqB) ]; 22 | maxDur = SampleRate.ir / freqs[0]; 23 | minDur = SampleRate.ir / freqs[1]; 24 | numBps = (minDur * bpRatio).trunc.clip(2, maxNumBps); 25 | maxDur = maxDur / numBps; 26 | minDur = minDur / numBps; 27 | maxDurStep = (maxDur - minDur) * maxDurSt; 28 | maxAmpStep = (maxAmp * 2) * maxAmSt; 29 | ({ 30 | DemandEnvGen.ar( 31 | Dswitch1( 32 | { Dbrown(maxAmp.neg, maxAmp, maxAmpStep) } ! maxNumBps, 33 | Dseries(0, 1) % numBps 34 | ), 35 | Dswitch1( 36 | { Dbrown(minDur, maxDur, maxDurStep) } ! maxNumBps, 37 | Dseries(0, 1) % numBps 38 | ) * SampleDur.ir) 39 | } ! q.numChans ) 40 | * amp.lag(0.2); 41 | }); 42 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/envelo.scd: -------------------------------------------------------------------------------- 1 | Ndef(\envelo).addSpec(\intv, [0, 36, \lin]); 2 | Ndef(\envelo).addSpec(\timescale, [0.001, 10, \exp]); 3 | Ndef(\envelo).addSpec(\curve, [-10, 10]); 4 | Ndef(\envelo).addSpec(\loopnode, [0, 7, \lin, 1]); 5 | Ndef(\envelo).addSpec(\formfact, [0.1, 10, \exp]); 6 | Ndef(\envelo).addSpec(\widfact, [0.1, 10, \exp]); 7 | Ndef(\envelo).addSpec(\spread, \unipolar); 8 | 9 | ( 10 | Ndef(\envelo, { |amp=0.1, freq=250, intv=19, timescale=1, curve=0, loopnode=0, formfact=2, widfact=0.5, spread=1| 11 | var env = EnvGen.kr( 12 | Env( 13 | { Rand(-1,1.0) }!11, 14 | { Rand(0, 1.0)}!10 * timescale, 15 | curve, 16 | releaseNode: 9, 17 | loopNode: loopnode) 18 | ); 19 | var pitch = (env * [1, 0.33, -1] * intv).midiratio * freq; 20 | Splay.ar( 21 | Formant.ar(pitch, pitch.scramble * formfact, pitch.scramble * widfact), spread) * amp; 22 | }); 23 | ); 24 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/filterFB.scd: -------------------------------------------------------------------------------- 1 | // feedback process, dhml 2014, 2 | // from weight matrix example 3 | // hh turned MC, 2019 4 | 5 | q = q ?? (); 6 | 7 | ( 8 | Ndef(\filterFB).addSpec(\freqA, [100, 1500, \exp]); 9 | Ndef(\filterFB).addSpec(\freqB, [100, 1500, \exp]); 10 | Ndef(\filterFB).addSpec(\loFreqA, [2, 40, \exp]); 11 | Ndef(\filterFB).addSpec(\loFreqB, [2, 40, \exp]); 12 | Ndef(\filterFB).addSpec(\filtfq, [80, 15000, \exp]); 13 | Ndef(\filterFB).addSpec(\delaytime, [0, 0.5, \lin]); 14 | Ndef(\filterFB).addSpec(\fbk, [0, 0.69, \amp]); 15 | Ndef(\filterFB).addSpec(\direct, [0.001, 0.9, \amp]); 16 | /* 17 | Ndef(\filterFB, { 18 | |amp=0, direct=0.05, freqA = 440, freqB = 586, loFreqA = 8.125, loFreqB = 13.193, 19 | filtfq = 3429, delaytime = 0.05, fbk = 0.01| 20 | var fbkIn = LocalIn.ar(1) * fbk; 21 | var extraIn = q.liveInput.ar(1) * direct; 22 | 23 | var osc = LFSaw.ar([freqA, freqB, loFreqA, loFreqB]).product; 24 | var filt = RLPF.ar(osc, filtfq, 1/8); 25 | var delay = DelayC.ar(filt + fbkIn + extraIn, 0.5, delaytime.lag(1.1)); 26 | var son = (filt + delay); 27 | LocalOut.ar(delay); 28 | son.clip2(1) * amp * (1-Dust.kr(1/10! q.numChans, 30).lag(0.3, 7)).clip(0,1); 29 | });*/ 30 | 31 | Ndef(\filterFB, { 32 | |amp=0, direct=0.05, freqA = 440, freqB = 586, loFreqA = 8.125, loFreqB = 13.193, 33 | filtfq = 3429, delaytime = 0.05, fbk = 0.01| 34 | var fbkIn = LocalIn.ar(q.numChans) * fbk; 35 | var extraIn = q.liveInput.ar(1) * direct; 36 | 37 | var ouz = q.numChans.collect{|i| 38 | 39 | var osc = LFSaw.ar([freqA, freqB, loFreqA, loFreqB * ExpRand(0.9, 1.2)]).product; 40 | // var filt = MoogFF.ar(osc, filtfq, 3.5); 41 | var filt = RLPF.ar(osc, filtfq.lag2(0.2) * ([1,2,1.5]@@i), 1/8); 42 | var delay = DelayC.ar(Limiter.ar(filt + fbkIn.wrapAt(i+1) + extraIn, 0.99), 0.5, delaytime.lag(1.1)); 43 | var son = (filt + delay); 44 | [son, delay] 45 | }; 46 | LocalOut.ar(ouz.flop.last); 47 | ouz.flop.first.clip2(1) * amp //* (1-Dust.kr(1/10! q.numChans, 30).lag(0.3, 7)).clip(0,1); 48 | }); 49 | ); 50 | 51 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/formSing.scd: -------------------------------------------------------------------------------- 1 | // Blip thru Formlet, pseudo-vocal synthesis. 2 | // hh&adc, since beijing 2005 3 | // 2019 made quad/MC 4 | 5 | // keywords: vocal, voice, formants 6 | 7 | /* 8 | Ndef(\formSing).gui; 9 | Ndef(\formSing).play; 10 | Ndef(\formSing).getHalo(\stepFdev).value; 11 | */ 12 | Ndef(\formSing).addSpec(\root, [20, 500, 6]); 13 | Ndef(\formSing).addSpec(\formfrq, [50, 5000, \exp]); 14 | Ndef(\formSing).addSpec(\harm, [1, 256, \exp]); 15 | Ndef(\formSing).addSpec(\formLag, [0.01, 100, \exp]); 16 | Ndef(\formSing).addSpec(\ndiv, [0.01, 1, \exp]); 17 | Ndef(\formSing).addSpec(\fdev, [0, 24, \amp]); 18 | Ndef(\formSing).addSpec(\round, [0, 3, \amp, 0.05]); 19 | 20 | ( 21 | // modulating formant frequency 22 | Ndef(\formSing, { arg amp=0, root=150, formfrq=500, harm=20, fdev=2, ndiv = 0.2, formLag=0.1, round = 1.5; 23 | var freqCompare = 1; // ((formfrq / root).log2).abs.min(1).linexp(0, 1, 0.25, 1); 24 | var in = Blip.ar( 25 | root.lag(formLag) * LFNoise0.kr(root * ndiv ! q.numChans, fdev.max(0.01) ).midiratio, 26 | harm.lag(formLag), // .max(formfrq / root * 0.25), 27 | 0.1 28 | ) * GrayNoise.ar(0.1 ! q.numChans, 1); 29 | 30 | Limiter.ar(Formlet.ar(in, formfrq.lag(formLag), 0.005, 0.02) * (freqCompare * amp.lag(0.1))) 31 | .softclip; 32 | }); 33 | ); 34 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/gendhy.scd: -------------------------------------------------------------------------------- 1 | // Reinhold Friedel special, HH 2022 2 | 3 | // a Gendy Synth with filters 4 | // adc: switched Gendy5 to gendy1 so we dont need SC3-plugins, 5 | // and Gendy3 to gendy2 for stability (gendy3 is unstable on macOS 6 | 7 | ( 8 | Ndef(\gendhy).addSpec(\minfreq, [1, 200, \exp]); 9 | Ndef(\gendhy).addSpec(\maxfreq, [100, 1000, \lin]); 10 | Ndef(\gendhy).addSpec(\ampdist, [0, 7]); 11 | Ndef(\gendhy).addSpec(\durdist, [0, 7]); 12 | Ndef(\gendhy).addSpec(\ampdistF, [0, 7]); 13 | Ndef(\gendhy).addSpec(\durdistF, [0, 7]); 14 | Ndef(\gendhy).addSpec(\filter, [0, 1, 6]); 15 | Ndef(\gendhy).addSpec(\balance, [0, 1, -1]); 16 | Ndef(\gendhy).addSpec(\rq1, [0.1, 2, \exp]); 17 | Ndef(\gendhy).addSpec(\rq2, [0.2, 2, \lin]); 18 | 19 | Ndef(\gendhy, { |amp=0.2 20 | minfreq=10, maxfreq=660, 21 | ampdist=7, durdist=0, 22 | ampdistF=0, durdistF=7, 23 | rq1=0.5, rq2=1, filter=0.5, balance=0 24 | | 25 | 26 | var ge = Gendy1.ar( 27 | ampdist ! q.numChans, 28 | durdist + [0, 3] % 7, 29 | minfreq:minfreq, 30 | maxfreq:[500, 750].reverse, 31 | mul:0.2*amp 32 | ); 33 | var ge3 = Gendy2.ar( 34 | ampdist + [0, 2] % 7, 35 | durdist + [1, 5] % 7, 36 | mul:0.2*amp 37 | ); 38 | var ffr = Gendy1.ar( 39 | ampdistF ! 2, 40 | durdistF, 41 | minfreq: 0.03, maxfreq:40 42 | ).linexp(-1,1, 50, 5000); 43 | 44 | var in = blend(ge, ge3, balance); 45 | var filt = 46 | RLPF.ar(in, ffr[0], rq1) 47 | - 48 | RLPF.ar(in, ffr[1], rq2); 49 | 50 | blend(filt, in, 1-filter).tanh; 51 | }); 52 | ); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/gendy1.scd: -------------------------------------------------------------------------------- 1 | /*** 2 | gendy1 example patch: 3 | use Gendy1 oscillator for modulation and synthesis. 4 | 5 | 6 | ampdist, durdist have 7 possible distributions: 7 | 0: LINEAR. 8 | 1: CAUCHY. 9 | 2: LOGIST. 10 | 3: HYPERBCOS. 11 | 4: ARCSINE. 12 | 5: EXPON. 13 | 6: SINUS. 14 | 15 | Ndef(\gendy1).clear; 16 | 17 | */ 18 | 19 | Ndef(\gendy1).addSpec(\dist, [0, 7]); 20 | Ndef(\gendy1).addSpec(\addd, [0.01, 0.9, \exp]); 21 | Ndef(\gendy1).addSpec(\minfreq1, [1, 100, \exp]); 22 | Ndef(\gendy1).addSpec(\maxfreq1, [1, 100, \exp]); 23 | Ndef(\gendy1).addSpec(\minfreq2, [20, 2000, \exp]); 24 | Ndef(\gendy1).addSpec(\maxfreq2, [20, 2000, \exp]); 25 | Ndef(\gendy1).addSpec(\ascale, [0.001, 1, \exp]); 26 | Ndef(\gendy1).addSpec(\dscale, [0.001, 1, \exp]); 27 | 28 | Ndef(\gendy1, { |amp = 0, dist = 3, addd = 0.01, 29 | minfreq1 = 0.2, maxfreq1 = 20, 30 | minfreq2 = 20, maxfreq2 = 2000, 31 | ascale = 1, dscale = 1| 32 | 33 | var n = q.numChans ? 2; 34 | var mods, snds; 35 | // var dist = Rand(0, 7); // choose new random distrib when running 36 | // var addd = exprand(0.001, 1); // choose new random distrib when running 37 | 38 | dist = dist.lag(1); 39 | addd = addd.lag(1); 40 | minfreq1 = minfreq1.lag(1); 41 | maxfreq1 = maxfreq1.lag(1); 42 | minfreq2 = minfreq2.lag(1); 43 | maxfreq2 = maxfreq2.lag(1); 44 | 45 | mods = Gendy1.kr(dist!n, dist, addd, addd, 46 | min(minfreq1, maxfreq1), max(minfreq1, maxfreq1), 47 | ascale.lag(1), dscale.lag(1)).exprange(0.001, 1); 48 | 49 | snds = Gendy1.ar(dist!n, dist, addd, addd, 50 | min(minfreq2, maxfreq2), max(minfreq2, maxfreq2), 51 | mods, mods); 52 | 53 | snds.sanitize * amp.lag(1); 54 | }); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/gendy2.scd: -------------------------------------------------------------------------------- 1 | /*** 2 | gendy2 example patch: 3 | use simple Gendy2 oscillator for modulation and synthesis. 4 | Gendy2 only changes the deltas of time/amp values 5 | 6 | ampdist, durdist have 7 possible distributions: 7 | 0: LINEAR. 8 | 1: CAUCHY. 9 | 2: LOGIST. 10 | 3: HYPERBCOS. 11 | 4: ARCSINE. 12 | 5: EXPON. 13 | 6: SINUS. 14 | 15 | Ndef(\gendy2).clear; 16 | 17 | */ 18 | 19 | Ndef(\gendy2).addSpec(\dist, [0, 7]); 20 | Ndef(\gendy2).addSpec(\addd, [0.01, 0.9, \exp]); 21 | Ndef(\gendy2).addSpec(\minfreq1, [1, 100, \exp]); 22 | Ndef(\gendy2).addSpec(\maxfreq1, [1, 100, \exp]); 23 | Ndef(\gendy2).addSpec(\minfreq2, [20, 2000, \exp]); 24 | Ndef(\gendy2).addSpec(\maxfreq2, [20, 2000, \exp]); 25 | Ndef(\gendy2).addSpec(\ascale, [0.001, 1, \exp]); 26 | Ndef(\gendy2).addSpec(\dscale, [0.001, 1, \exp]); 27 | 28 | Ndef(\gendy2, { |amp = 0, dist = 3, addd = 0.01, 29 | minfreq1 = 0.2, maxfreq1 = 20, 30 | minfreq2 = 20, maxfreq2 = 2000, 31 | ascale = 1, dscale = 1| 32 | 33 | var n = q.numChans ? 2; 34 | var mods, snds; 35 | // var dist = Rand(0, 7); // choose new random distrib when running 36 | // var addd = exprand(0.001, 1); // choose new random distrib when running 37 | 38 | dist = dist.lag(1); 39 | addd = addd.lag(1); 40 | minfreq1 = minfreq1.lag(1); 41 | maxfreq1 = maxfreq1.lag(1); 42 | minfreq2 = minfreq2.lag(1); 43 | maxfreq2 = maxfreq2.lag(1); 44 | 45 | mods = Gendy2.kr(dist!n, dist, addd, addd, 46 | min(minfreq1, maxfreq1), max(minfreq1, maxfreq1), 47 | ascale.lag(1), dscale.lag(1)).exprange(0.001, 1); 48 | 49 | snds = Gendy2.ar(dist!n, dist, addd, addd, 50 | min(minfreq2, maxfreq2), max(minfreq2, maxfreq2), 51 | mods, mods); 52 | 53 | snds.sanitize * amp.lag(1); 54 | }); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/granbuf.scd: -------------------------------------------------------------------------------- 1 | /// load a buffer of files to granulate 2 | /// here, with a set of textfiles 3 | 4 | /* 5 | ///////// 6 | Ndef(\granbuf).clear; 7 | 8 | Ndef(\granbuf).gui(12); 9 | 10 | */ 11 | q = q ? (); 12 | 13 | 14 | // the Ndef specs: 15 | Ndef(\granbuf).addSpec(\sndbuf, \unipolar); // index into buffer array, 0.0 is first, 1.0 is last 16 | Ndef(\granbuf).addSpec(\sndbufvar, \unipolar); // how much overlap with next buffer 17 | Ndef(\granbuf).addSpec(\rate, [0.7, 1.4, \exp]); // buffer playback rate 18 | Ndef(\granbuf).addSpec(\ratevar, [0, 1]); // how much variation of playback rate between grains 19 | Ndef(\granbuf).addSpec(\dens, [0.5, 200, \exp]); // density: how many grains per second 20 | Ndef(\granbuf).addSpec(\trigrand, [0, 1]); // 0 is regular rhythm, 1 is random 21 | Ndef(\granbuf).addSpec(\overlap, [0.1, 40, \exp]); // how much overlap of grains - 2 is smooth continuous 22 | Ndef(\granbuf).addSpec(\scanspeed, [-2, 2]); // how fast to move thru buffer - 1 is normal, 0 is freeze 23 | Ndef(\granbuf).addSpec(\posvar, [0, 0.1, 4]); // how much file read pos varies 24 | Ndef(\granbuf).addSpec(\panvar, [0, 1]); // 25 | 26 | // make sound buffer range known so Ndef can access it 27 | Ndef(\granbuf).addHalo(\sndBufRange, [0, 0]); 28 | 29 | 30 | /* 31 | Ndef(\granbuf).setUni(\posvar, 0.5); 32 | Ndef(\granbuf).set(\scanspeed, 0.25); 33 | Ndef(\granbuf).set(\scanspeed, -0.25); 34 | */ 35 | 36 | Ndef(\granbuf, { | 37 | // don't store amp and sndbuf ... 38 | amp = 0.1, sndbuf = 0, 39 | // all of these params are stored in preset 40 | sndbufvar = 0.1, 41 | rate = 1, ratevar = 0.1, 42 | trigrand = 0, dens = 30, overlap = 2, 43 | scanspeed = 1, posvar = 0.001, 44 | panvar = 0.25| 45 | 46 | var numChans = NTMI.numChans ? 2; 47 | 48 | var trig = Impulse.ar(dens * (1-trigrand)) + Dust.ar(dens * trigrand); 49 | var sndbuf2 = sndbuf.linlin(0, 1, *Ndef(\granbuf).getHalo(\sndBufRange)); 50 | var sndbuf3 = sndbuf2 + Latch.ar(WhiteNoise.kr(sndbufvar), trig).round(1); 51 | var filepos = Phasor.ar(0, 1 / SampleRate.ir / BufDur.kr(sndbuf2) * scanspeed, 0, 1); 52 | var filepos2 = filepos + WhiteNoise.ar(posvar); 53 | var ratekr = 1.25 ** WhiteNoise.kr (ratevar) * rate; 54 | var panpos = WhiteNoise.kr(panvar); 55 | 56 | var amp2 = amp.lag(0.1) * (overlap.max(1) ** -0.25); 57 | 58 | GrainBuf.ar(numChans, trig, overlap / dens, sndbuf3, ratekr, filepos2, 2, panpos) * amp2; 59 | }); 60 | 61 | // Preset: don't store amp and sndbuf 62 | Ndef(\granbuf).addHalo(\namesToStore, Ndef(\granbuf).controlKeys.drop(2)); 63 | 64 | MFdef('bufSetRange').(Ndef('granbuf'), q.bufs['global'], 'global'); 65 | 66 | Ndef(\granbuf); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/kiteHi.scd: -------------------------------------------------------------------------------- 1 | // vivid noise synthesis, 2 | // hh, cologne 2003- 3 | // made MC 2019 4 | 5 | Ndef(\kiteHi).addSpec(\ffreq, [-1000, 30000, \lin]); 6 | Ndef(\kiteHi).addSpec(\move, [0.05, 40, \exp]); 7 | Ndef(\kiteHi).addSpec(\hack, [1, 40, \exp]); 8 | Ndef(\kiteHi).addSpec(\dustfreq, [0.20, 100000, \exp]); 9 | Ndef(\kiteHi).addSpec(\width, [0.01, 1.0, \amp]); 10 | Ndef(\kiteHi).addSpec(\lag, [0, 4.0, 5]); 11 | 12 | Ndef(\kiteHi).addHalo(\stepDustfreq, { arg val; var curr; 13 | var nd = Ndef(\kiteHi); 14 | curr = nd.get(\dustfreq); 15 | "% - \stepDustfreq: ".postf(nd); 16 | curr = if (curr < 10000, { curr * 1.618 }, 0.2).postln; 17 | nd.set(\dustfreq, curr); 18 | }); 19 | 20 | Ndef(\kiteHi).addHalo(\stepWidth, { arg val; var curr; 21 | var nd = Ndef(\kiteHi); 22 | curr = nd.get(\width); 23 | "% - \width: ".postf(nd); 24 | curr = if (curr < 1, { curr * 1.618 }, 0.01).postln; 25 | nd.set(\width, curr); 26 | }); 27 | 28 | Ndef(\kiteHi, { arg amp=0, ffreq=12000, move = 0.2, hack=3, dustfreq=100, width=0.3, lag=0.25; 29 | var n=5; 30 | var snd = ({ 31 | var in = LFClipNoise.ar(dustfreq.lag(lag), LFPulse.ar( hack * Rand(0.5, 2), Rand(0, 2pi), width+Rand(-0.3, 0.4)) ); 32 | Ringz.ar(in, 33 | ffreq.lag(lag) * LFDNoise1.kr(move-0.05, 0.95, 1), 34 | 1.25/hack 35 | ) 36 | } ! n) 37 | .clump( q.numChans ).sum; 38 | 39 | (LPF.ar(snd, 400) + HPF.ar(snd, 400, 0.33)).softclip * (amp * 0.25).lag(0.03); 40 | }); 41 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/lincong.scd: -------------------------------------------------------------------------------- 1 | // Sound from Jonas, uses internal feedback and the LinCongN Chaotic Ugen 2 | 3 | 4 | // specs 5 | Ndef(\lincong).addSpec(\chaos, [1, 5, \exp]); 6 | Ndef(\lincong).addSpec(\fbQ, [0.1, 2, 1]); 7 | Ndef(\lincong).addSpec(\freq, [100, 1500, \exp]); 8 | 9 | Ndef(\lincong, {|amp = 0.0, freq=567, chaos=2, fbQ=1.0| 10 | var src, kaos, local, soundIn, ampIn; 11 | local = LocalIn.ar(q.numChans); 12 | soundIn = SoundIn.ar(0); 13 | ampIn = Amplitude.kr(soundIn, mul:10); 14 | // use interpolating linCongC for wah-wah and more gliss 15 | kaos = LinCongN.ar(chaos**4, 16 | ampIn.linlin(0,1,0.9,1.9), 17 | 0.001 + Ndef.ar(\lincong)*fbQ, 18 | 1-local 19 | ).linlin(-1,1,0,2); 20 | 21 | src = SinOsc.ar(freq*[kaos/2, kaos, kaos/4, kaos*2, kaos/10], 0, kaos/2); 22 | 23 | local = OnePole.ar(local, 0.4); 24 | local = OnePole.ar(local, -0.08); 25 | local = Rotate2.ar(local[0], local[1], 0.2); 26 | local = LeakDC.ar(local); 27 | local = (local + kaos); 28 | LocalOut.ar(local); 29 | 30 | Limiter.ar(Splay.ar(src.sum, 1, amp), 0.99); 31 | }); 32 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/allArm.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('allArm'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('allArm').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'divefreq', 1.01 ], [ 'topfreq', 37.0 ], [ 'filtfreq', 910.0 ] ]), 12 | ('mildew' -> [ [ 'divefreq', 1.01 ], [ 'topfreq', 37.0 ], [ 'filtfreq', 910.0 ] ]), 13 | ('krakl' -> [ [ 'divefreq', 18.72 ], [ 'topfreq', 57135.0 ], [ 'filtfreq', 112.0 ] ]), 14 | ('set1' -> [ [ 'divefreq', 20.0 ], [ 'topfreq', 67270.0 ], [ 'filtfreq', 136.0 ] ]), 15 | ('set2' -> [ [ 'divefreq', 12.97 ], [ 'topfreq', 912.0 ], [ 'filtfreq', 25599.0 ] ]), 16 | ('doak' -> [ [ 'divefreq', 0.06 ], [ 'topfreq', 49176.0 ], [ 'filtfreq', 2986.0 ] ]), 17 | ('set2333' -> [ [ 'divefreq', 0.09 ], [ 'topfreq', 68.0 ], [ 'filtfreq', 65.0 ] ]), 18 | ('nervz' -> [ [ 'divefreq', 0.52 ], [ 'topfreq', 561.0 ], [ 'filtfreq', 54939.0 ] ]) 19 | ] 20 | 21 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/beatX.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('beatX'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('beatX').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'seqSel', 0.77 ], [ 'att', 0.089756338147776 ], [ 'dcy', 0.040928773234601 ], [ 'ffreq', 3042.0 ], [ 'reso', 26.729014642213 ], [ 'mod', 0.038735332968464 ], [ 'patt', 15.0 ], [ 'volKick', 0.3781172439565 ], [ 'volSnare', 0.1975130711039 ], [ 'volHat', 0.3082203635219 ] ]), 12 | ('chichi' -> [ [ 'seqSel', 0.77 ], [ 'att', 0.0 ], [ 'dcy', 0.08016302896208 ], [ 'ffreq', 3042.0 ], [ 'reso', 26.729014642213 ], [ 'mod', 0.038735332968464 ], [ 'patt', 15.0 ], [ 'volKick', 0.30279107527785 ], [ 'volSnare', 0.1975130711039 ], [ 'volHat', 0.3082203635219 ] ]), 13 | ('bongo' -> [ [ 'seqSel', 0.89 ], [ 'att', 0.0016737175061848 ], [ 'dcy', 0.056360407728994 ], [ 'ffreq', 322.0 ], [ 'reso', 8.6501116608818 ], [ 'mod', 0.35085689261794 ], [ 'patt', 8.0 ], [ 'volKick', 0.92820405126028 ], [ 'volSnare', 0.47493889424561 ], [ 'volHat', 0.40873308703784 ] ]), 14 | ('lating' -> [ [ 'seqSel', 0.28 ], [ 'att', 0.0099948055056053 ], [ 'dcy', 0.20620451311608 ], [ 'ffreq', 1260.0 ], [ 'reso', 24.453471199911 ], [ 'mod', 0.019756567226813 ], [ 'patt', 12.0 ], [ 'volKick', 0.29887333096264 ], [ 'volSnare', 0.38267976506082 ], [ 'volHat', 0.86474381207894 ] ]), 15 | ('basic' -> [ [ 'seqSel', 0 ], [ 'att', 0.002 ], [ 'dcy', 0.05 ], [ 'ffreq', 5000 ], [ 'reso', 2 ], [ 'mod', 0.2 ], [ 'patt', 0 ], [ 'volKick', 0.5 ], [ 'volSnare', 0.5 ], [ 'volHat', 0.5 ] ]) 16 | ] 17 | 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/blippoo.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('blippoo'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('blippoo').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'freqOscA', 10.46 ], [ 'freqOscB', 0.32 ], [ 'fm_b_a', 10.02 ], [ 'fm_a_b', 2.81 ], [ 'fm_r_a', 160.2 ], [ 'fm_r_b', 16.27 ], [ 'fm_sah_a', 6.14 ], [ 'fm_sah_b', 6.14 ], [ 'freqPeak1', 231.4 ], [ 'freqPeak2', 895 ], [ 'fm_r_peak1', 1000 ], [ 'fm_r_peak2', 3000 ], [ 'fm_sah_peak', 272.1 ], [ 'resonance', 0.06 ] ]) 12 | ] 13 | 14 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/brushes.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('brushes'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('brushes').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'rabisco', 6.5265364214199 ], [ 'trig', 9.7 ], [ 'cf', 799.37226579907 ], [ 'rq', 0.43649814250183 ] ]), 12 | ('sniffle' -> [ [ 'rabisco', 12.401365797908 ], [ 'trig', 10.0 ], [ 'cf', 472.13992332334 ], [ 'rq', 4.3350637192697 ] ]), 13 | ('hektor' -> [ [ 'rabisco', 21.490556028698 ], [ 'trig', 5.0 ], [ 'cf', 1245.6686001685 ], [ 'rq', 1.0486017355323 ] ]), 14 | ('snowshov ' -> [ [ 'rabisco', 4.0538779243737 ], [ 'trig', 9.8 ], [ 'cf', 89.847581438122 ], [ 'rq', 5.7628877571976 ] ]) 15 | ] 16 | 17 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/bufRd.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('bufRd'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('bufRd').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'bufnum', 0.42609464758828 ], [ 'rate', -0.49365957176777 ], [ 'start', 0.54948070233264 ], [ 'end', 0.02139415830973 ], [ 'mod', 0.2580760717392 ], [ 'modSpeed', 28.011306997846 ], [ 'modResl', 29.840993843546 ], [ 'atk', 0.96553266537189 ], [ 'sustain', 0.59930643999992 ], [ 'rel', 1.9343704471588 ], [ 'ampenv', 0.06867852936557 ], [ 'modRateFreq', 3.8413844027531 ], [ 'pan', -0.23531905530621 ] ]), 12 | ('clackity' -> [ [ 'bufnum', 0.42609464758828 ], [ 'rate', -0.49365957176777 ], [ 'start', 0.54948070233264 ], [ 'end', 0.02139415830973 ], [ 'mod', 0.2580760717392 ], [ 'modSpeed', 28.011306997846 ], [ 'modResl', 29.840993843546 ], [ 'atk', 0.96553266537189 ], [ 'sustain', 0.59930643999992 ], [ 'rel', 1.9343704471588 ], [ 'ampenv', 0.06867852936557 ], [ 'modRateFreq', 3.8413844027531 ], [ 'pan', -0.23531905530621 ] ]), 13 | ('hangs' -> [ [ 'bufnum', 0.24926452056428 ], [ 'rate', 0.92277676345658 ], [ 'start', 0.22724475607469 ], [ 'end', 0.0086394814681533 ], [ 'mod', 0.780089856749 ], [ 'modSpeed', 36.9902950292 ], [ 'modResl', 0.8460681563005 ], [ 'atk', 1.1945144359195 ], [ 'sustain', 0.95173664201253 ], [ 'rel', 0.40704374622695 ], [ 'ampenv', 0.31198985983764 ], [ 'modRateFreq', 0.49655181855194 ], [ 'pan', -0.28554146041502 ] ]), 14 | ('yodel' -> [ [ 'bufnum', 0.084718227386475 ], [ 'rate', -0.12307130222195 ], [ 'start', 0.30808121766918 ], [ 'end', 0.0017410446652579 ], [ 'mod', 0.35773992538452 ], [ 'modSpeed', 23.217112133309 ], [ 'modResl', 0.53814519689355 ], [ 'atk', 1.4800898733139 ], [ 'sustain', 1.0250324423526 ], [ 'rel', 0.18157900391793 ], [ 'ampenv', 0.14738134202855 ], [ 'modRateFreq', 13.09470917946 ], [ 'pan', 0.84558248519897 ] ]), 15 | ('phunky' -> [ [ 'bufnum', 0.44222372102079 ], [ 'rate', 1.7047000415535 ], [ 'start', 0.019021783714454 ], [ 'end', 0.1077364824324 ], [ 'mod', 0.55968512993148 ], [ 'modSpeed', 11.581264905477 ], [ 'modResl', 1.2913995702572 ], [ 'atk', 0.84191816455836 ], [ 'sustain', 0.49957275998996 ], [ 'rel', 0.20874912376933 ], [ 'ampenv', 0.86190183478311 ], [ 'modRateFreq', 9.1974728750538 ], [ 'pan', 0.016024519234979 ] ]) 16 | ] 17 | 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/dog.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('dog'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('dog').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'freq', 1021.4098887435 ], [ 'intv', -4.1967038335765 ], [ 'timescale', 0.48732153593965 ], [ 'curve', -1.4429691792089 ], [ 'loopnode', 1.5282649238387 ], [ 'dens', 873.71322760581 ], [ 'resfreq', 26.550841359512 ], [ 'ringtime', 0.097926875017882 ] ]), 12 | ('creechy' -> [ [ 'freq', 1021.4098887435 ], [ 'intv', -4.1967038335765 ], [ 'timescale', 0.48732153593965 ], [ 'curve', -1.4429691792089 ], [ 'loopnode', 1.5282649238387 ], [ 'dens', 873.71322760581 ], [ 'resfreq', 26.550841359512 ], [ 'ringtime', 0.097926875017882 ] ]), 13 | ('aadsad' -> [ [ 'freq', 250 ], [ 'intv', 19 ], [ 'timescale', 1 ], [ 'curve', 0 ], [ 'loopnode', 0 ], [ 'dens', 10 ], [ 'resfreq', 500 ], [ 'ringtime', 0.01 ] ]), 14 | ('mine' -> [ [ 'freq', 155.63924112381 ], [ 'intv', 2.3762376237624 ], [ 'timescale', 2.5772695541382 ], [ 'curve', 3.0500168800354 ], [ 'loopnode', 5.9040193557739 ], [ 'dens', 10.0 ], [ 'resfreq', 654.45754789334 ], [ 'ringtime', 0.03424943924682 ] ]), 15 | ('flix' -> [ [ 'freq', 1836.2026367188 ], [ 'intv', -19.242883682251 ], [ 'timescale', 0.10509008169174 ], [ 'curve', -7.9834651947021 ], [ 'loopnode', 7.149365901947 ], [ 'dens', 112.80592346191 ], [ 'resfreq', 28.632188796997 ], [ 'ringtime', 0.54184144735336 ] ]), 16 | ('fux' -> [ [ 'freq', 68.101778199274 ], [ 'intv', 8.5553910617941 ], [ 'timescale', 0.18418977466917 ], [ 'curve', 4.6835279464722 ], [ 'loopnode', 0.33428359927595 ], [ 'dens', 41.088428278421 ], [ 'resfreq', 8319.1243261437 ], [ 'ringtime', 0.40600614784648 ] ]), 17 | ('yowl' -> [ [ 'freq', 3345.6163789384 ], [ 'intv', -1.6279820121171 ], [ 'timescale', 1.8515048424242 ], [ 'curve', 0.018146682882312 ], [ 'loopnode', 3.1945022212242 ], [ 'dens', 483.93618437973 ], [ 'resfreq', 383.27064051868 ], [ 'ringtime', 0.45094827539083 ] ]), 18 | ('crank' -> [ [ 'freq', 285.29792832434 ], [ 'intv', 23.97264289856 ], [ 'timescale', 0.18907006443835 ], [ 'curve', -3.7249112129211 ], [ 'loopnode', 6.9612493515015 ], [ 'dens', 627.03603625298 ], [ 'resfreq', 2171.3655312931 ], [ 'ringtime', 0.66331473736416 ] ]) 19 | ] 20 | 21 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/dynstosyn.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('dynstosyn'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('dynstosyn').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'bpRatio', 0.78799910296992 ], [ 'freqA', 208.07161899677 ], [ 'freqB', 951.76923838939 ], [ 'maxDurSt', 0.037383166476923 ], [ 'maxAmp', 0.20446211862429 ], [ 'maxAmSt', 0.014273472265107 ] ]), 12 | ('norgel' -> [ [ 'bpRatio', 0.78799910296992 ], [ 'freqA', 139.99603336869 ], [ 'freqB', 951.76923838939 ], [ 'maxDurSt', 0.15329917975421 ], [ 'maxAmp', 0.62942182656752 ], [ 'maxAmSt', 0.0 ] ]), 13 | ('ovato' -> [ [ 'bpRatio', 0.78799910296992 ], [ 'freqA', 139.99603336869 ], [ 'freqB', 951.76923838939 ], [ 'maxDurSt', 0.0 ], [ 'maxAmp', 0.62942182656752 ], [ 'maxAmSt', 0.2217463116934 ] ]), 14 | ('drony' -> [ [ 'bpRatio', 0.92786081006208 ], [ 'freqA', 343.5783705278 ], [ 'freqB', 35.958022201705 ], [ 'maxDurSt', 0.75081635939074 ], [ 'maxAmp', 0.46984831311548 ], [ 'maxAmSt', 0.33758224370901 ] ]) 15 | ] 16 | 17 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/formSing.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('formSing'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('formSing').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'root', 37.866332488763 ], [ 'formfrq', 561.12748649419 ], [ 'harm', 43.91140060511 ], [ 'fdev', 0.52610604890761 ], [ 'ndiv', 0.87253213239376 ], [ 'formLag', 5.5692423612499 ], [ 'round', 0.5 ] ]), 12 | ('hoolow' -> [ [ 'root', 37.866332488763 ], [ 'formfrq', 561.12748649419 ], [ 'harm', 43.91140060511 ], [ 'fdev', 0.52610604890761 ], [ 'ndiv', 0.87253213239376 ], [ 'formLag', 5.5692423612499 ], [ 'round', 0.5 ] ]), 13 | ('high1' -> [ [ 'root', 337.37326951064 ], [ 'formfrq', 2042.1193263373 ], [ 'harm', 47.031503752819 ], [ 'fdev', 4.7407407407407 ], [ 'ndiv', 0.051417518276839 ], [ 'formLag', 1.2915496650149 ], [ 'round', 1.5 ] ]), 14 | ('yoooho' -> [ [ 'root', 105.64003170462 ], [ 'formfrq', 266.83496156032 ], [ 'harm', 4.5372500887818 ], [ 'fdev', 11.532024793388 ], [ 'ndiv', 0.32461130182667 ], [ 'formLag', 1.0983087736396 ], [ 'round', 2.0 ] ]), 15 | ('dron' -> [ [ 'root', 32.996120279612 ], [ 'formfrq', 185.2346773264 ], [ 'harm', 51.066095062849 ], [ 'fdev', 0.77786759381642 ], [ 'ndiv', 0.022703754039493 ], [ 'formLag', 0.77337403549425 ], [ 'round', 2.75 ] ]), 16 | ('subbb' -> [ [ 'root', 36.243292207097 ], [ 'formfrq', 150.82982452366 ], [ 'harm', 2.0615777268195 ], [ 'fdev', 6.6583717742538 ], [ 'ndiv', 0.019168343424257 ], [ 'formLag', 5.5958889807481 ], [ 'round', 0.65 ] ]), 17 | ('noodle' -> [ [ 'root', 192.78541451917 ], [ 'formfrq', 80.738348786584 ], [ 'harm', 2.036774674467 ], [ 'fdev', 7.64659740453 ], [ 'ndiv', 0.051036773760172 ], [ 'formLag', 0.30550283203961 ], [ 'round', 1.1 ] ]) 18 | ] 19 | 20 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/gendhy.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('gendhy'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('gendhy').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'minfreq', 10 ], [ 'maxfreq', 660 ], [ 'ampdist', 7 ], [ 'durdist', 0 ], [ 'ampdistF', 0 ], [ 'durdistF', 7 ], [ 'rq1', 0.5 ], [ 'rq2', 1 ], [ 'filter', 0.5 ], [ 'balance', 0 ] ]) 12 | ] 13 | 14 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/gendy1.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('gendy1'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('gendy1').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'dist', 1.8047428287364 ], [ 'addd', 0.059276755809133 ], [ 'minfreq1', 2.3224448156196 ], [ 'maxfreq1', 28.045229264258 ], [ 'minfreq2', 31.732920285535 ], [ 'maxfreq2', 59.3764197213 ], [ 'ascale', 0.38538367392012 ], [ 'dscale', 0.0021237682656323 ] ]), 12 | ('schmiert_ab' -> [ [ 'dist', 7.0 ], [ 'addd', 0.48462399741035 ], [ 'minfreq1', 16.8854728759 ], [ 'maxfreq1', 95.24363868793 ], [ 'minfreq2', 463.56363612018 ], [ 'maxfreq2', 1686.3818585733 ], [ 'ascale', 0.014412195967189 ], [ 'dscale', 0.13894954943731 ] ]), 13 | ('quiz' -> [ [ 'dist', 2.8731646126198 ], [ 'addd', 0.01 ], [ 'minfreq1', 1.1144499854549 ], [ 'maxfreq1', 15.936542392426 ], [ 'minfreq2', 20.714292643964 ], [ 'maxfreq2', 1445.7770712786 ], [ 'ascale', 1.0 ], [ 'dscale', 1.0 ] ]), 14 | ('snor' -> [ [ 'dist', 1.5222444682975 ], [ 'addd', 0.041612686882204 ], [ 'minfreq1', 1.8798145434267 ], [ 'maxfreq1', 18.75099536261 ], [ 'minfreq2', 38.549473733494 ], [ 'maxfreq2', 61.989706530195 ], [ 'ascale', 0.48147257439326 ], [ 'dscale', 0.0033673552006924 ] ]), 15 | ('snur' -> [ [ 'dist', 3.8888888888889 ], [ 'addd', 0.038540112617865 ], [ 'minfreq1', 2.40409918351 ], [ 'maxfreq1', 23.923457043695 ], [ 'minfreq2', 34.184893282431 ], [ 'maxfreq2', 2000.0 ], [ 'ascale', 0.20347198414042 ], [ 'dscale', 0.14948691337092 ] ]), 16 | ('aman' -> [ [ 'dist', 4.2962962962963 ], [ 'addd', 0.010534665036276 ], [ 'minfreq1', 1.0 ], [ 'maxfreq1', 36.0165559757 ], [ 'minfreq2', 20.0 ], [ 'maxfreq2', 1771.7847131146 ], [ 'ascale', 1.0 ], [ 'dscale', 0.67725611828302 ] ]) 17 | ] 18 | 19 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/gendy2.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('gendy2'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('gendy2').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'dist', 2.6834215002043 ], [ 'addd', 0.075626677493685 ], [ 'minfreq1', 28.327192603521 ], [ 'maxfreq1', 7.5016758574327 ], [ 'minfreq2', 79.265283310254 ], [ 'maxfreq2', 531.0730509607 ], [ 'ascale', 0.84409013708823 ], [ 'dscale', 0.0027810304588908 ] ]), 12 | ('slo' -> [ [ 'dist', 2.6834215002043 ], [ 'addd', 0.9 ], [ 'minfreq1', 3.5502958947307 ], [ 'maxfreq1', 1.0 ], [ 'minfreq2', 20.0 ], [ 'maxfreq2', 381.4637519945 ], [ 'ascale', 0.096411088049075 ], [ 'dscale', 0.21544346900319 ] ]), 13 | ('moto' -> [ [ 'dist', 6.2002331765194 ], [ 'addd', 0.035319544597194 ], [ 'minfreq1', 2.7212417068496 ], [ 'maxfreq1', 21.445107675035 ], [ 'minfreq2', 380.16606774545 ], [ 'maxfreq2', 1540.545824337 ], [ 'ascale', 0.01245197084735 ], [ 'dscale', 0.0038663537521924 ] ]), 14 | ('hi_st' -> [ [ 'dist', 4.6666666666667 ], [ 'addd', 0.33110550102496 ], [ 'minfreq1', 2.586416205276 ], [ 'maxfreq1', 57.097061336482 ], [ 'minfreq2', 2000.0 ], [ 'maxfreq2', 296.31750361088 ], [ 'ascale', 0.8961505019466 ], [ 'dscale', 0.92950978988065 ] ]), 15 | ('perez' -> [ [ 'dist', 2.8147194014557 ], [ 'addd', 0.014654531813193 ], [ 'minfreq1', 1.6665506963202 ], [ 'maxfreq1', 12.520166549796 ], [ 'minfreq2', 20.0 ], [ 'maxfreq2', 296.31750361088 ], [ 'ascale', 1.0 ], [ 'dscale', 0.14878190348481 ] ]) 16 | ] 17 | 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/kiteHi.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('kiteHi'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('kiteHi').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'ffreq', 3784.0594686848 ], [ 'move', 0.46226985000263 ], [ 'hack', 21.588941312174 ], [ 'dustfreq', 25.744416026827 ], [ 'width', 0.097392258192116 ], [ 'lag', 0.068614238839252 ] ]), 12 | ('tyrrr' -> [ [ 'ffreq', 3784.0594686848 ], [ 'move', 0.46226985000263 ], [ 'hack', 21.588941312174 ], [ 'dustfreq', 25.744416026827 ], [ 'width', 0.097392258192116 ], [ 'lag', 0.068614238839252 ] ]), 13 | ('looow' -> [ [ 'ffreq', -15.873015873016 ], [ 'move', 0.10050406872108 ], [ 'hack', 18.390946825573 ], [ 'dustfreq', 6.7479256339535 ], [ 'width', 0.010837507622113 ], [ 'lag', 0.068844009644467 ] ]), 14 | ('tingle' -> [ [ 'ffreq', 6202.6112926345 ], [ 'move', 0.23862549185034 ], [ 'hack', 2.5926823622954 ], [ 'dustfreq', 0.34497284518205 ], [ 'width', 0.077957301002963 ], [ 'lag', 0.069183744336871 ] ]), 15 | ('wuzl' -> [ [ 'ffreq', 1620.4742193222 ], [ 'move', 10.387440572754 ], [ 'hack', 3.1872674095138 ], [ 'dustfreq', 814.50152729014 ], [ 'width', 0.21847083884931 ], [ 'lag', 1.5449539038944 ] ]), 16 | ('traeller' -> [ [ 'ffreq', 3160.4690551758 ], [ 'move', 0.22708083693073 ], [ 'hack', 14.729084248692 ], [ 'dustfreq', 1679.3216756762 ], [ 'width', 0.027743799344376 ], [ 'lag', 0.27952753991245 ] ]), 17 | ('ziep' -> [ [ 'ffreq', 16652.008295059 ], [ 'move', 1.4628064275615 ], [ 'hack', 7.52047961793 ], [ 'dustfreq', 6107.1197258268 ], [ 'width', 0.96248259858895 ], [ 'lag', 0.32401107424398 ] ]) 18 | ] 19 | 20 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/lincong.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('lincong'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('lincong').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'freq', 322.27348215389 ], [ 'chaos', 2.287313096053 ], [ 'fbQ', 0.87838373702474 ] ]), 12 | ('fullo' -> [ [ 'freq', 1209.9033603903 ], [ 'chaos', 4.2530763440263 ], [ 'fbQ', 0.45019818534873 ] ]), 13 | ('panda' -> [ [ 'freq', 793.67642658162 ], [ 'chaos', 3.1787554808824 ], [ 'fbQ', 0.99303927960858 ] ]), 14 | ('ratata' -> [ [ 'freq', 665.78504837643 ], [ 'chaos', 2.2062569626368 ], [ 'fbQ', 1.2530014463823 ] ]), 15 | ('stop_n_go' -> [ [ 'freq', 923.60611380284 ], [ 'chaos', 1.7090418815197 ], [ 'fbQ', 1.3673511317508 ] ]) 16 | ] 17 | 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/micDelay.pxpreset.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'delayMin', 0.33698485826743 ], [ 'delayMax', 0.064948450169649 ], [ 'speed', 0.89815538423846 ], [ 'feedback', 0.2148311039587 ], [ 'transpose', -1.8043590545654 ], [ 'laG', 0.049076289757255 ] ]), ('set1' -> [ [ 'delayMin', 0.11483888212716 ], [ 'delayMax', 0.22346337269166 ], [ 'speed', 0.24594509307239 ], [ 'feedback', 0.13570247938245 ], [ 'transpose', 6.0144910733873 ], [ 'laG', 0.23295363737566 ] ]), ('set2' -> [ [ 'delayMin', 0.2550286052306 ], [ 'delayMax', 0.31790946109565 ], [ 'speed', 0.18166845842441 ], [ 'feedback', 0.38183488347318 ], [ 'transpose', 5.664734634606 ], [ 'laG', 3.2833850863925 ] ]), ('doN' -> [ [ 'delayMin', 0.33698485826743 ], [ 'delayMax', 0.064948450169649 ], [ 'speed', 0.89815538423846 ], [ 'feedback', 0.2148311039587 ], [ 'transpose', -1.8043590545654 ], [ 'laG', 0.049076289757255 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/moogSing.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('moogSing'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('moogSing').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'moogRoot', 29.5 ], [ 'lpRatio', 30.91875195014 ], [ 'lfDepth', 24.335492263317 ], [ 'lfSpeed', 0.11431941997091 ], [ 'reso', 15.977228301962 ], [ 'strobe', 0.41741142707201 ], [ 'dense', 0.74736241216295 ] ]), 12 | ('ovatony' -> [ [ 'moogRoot', 29.5 ], [ 'lpRatio', 30.91875195014 ], [ 'lfDepth', 24.335492263317 ], [ 'lfSpeed', 0.11431941997091 ], [ 'reso', 15.977228301962 ], [ 'strobe', 0.41741142707201 ], [ 'dense', 0.74736241216295 ] ]), 13 | ('pulsey' -> [ [ 'moogRoot', 38.5 ], [ 'lpRatio', 34.447288513184 ], [ 'lfDepth', 0.98599159986292 ], [ 'lfSpeed', 1.7597434549641 ], [ 'reso', 34.289583539111 ], [ 'strobe', 3.5547564902532 ], [ 'dense', 0.078404246461554 ] ]), 14 | ('strobey' -> [ [ 'moogRoot', 21.5 ], [ 'lpRatio', 37.439325049867 ], [ 'lfDepth', 23.669564121945 ], [ 'lfSpeed', 6.2249815131502 ], [ 'reso', 6.8545482208201 ], [ 'strobe', 4.2799664970183 ], [ 'dense', 0.6909468048031 ] ]), 15 | ('ru' -> [ [ 'moogRoot', 24 ], [ 'lpRatio', 36 ], [ 'lfDepth', 24 ], [ 'lfSpeed', 0.35 ], [ 'reso', 47.618726630085 ], [ 'strobe', 1.9171544822905 ], [ 'dense', 0.883245 ] ]), 16 | ('dumpf' -> [ [ 'moogRoot', 37.5 ], [ 'lpRatio', 21.672437667847 ], [ 'lfDepth', 18.785761717116 ], [ 'lfSpeed', 0.024969490316016 ], [ 'reso', 47.163358845612 ], [ 'strobe', 8.0838154754602 ], [ 'dense', 0.72472774904966 ] ]), 17 | ('sanglich' -> [ [ 'moogRoot', 39.0 ], [ 'lpRatio', 30.532663917819 ], [ 'lfDepth', 31.132390523122 ], [ 'lfSpeed', 2.5452387905468 ], [ 'reso', 7.0390555242937 ], [ 'strobe', 1.7217534613645 ], [ 'dense', 0.94141330794096 ] ]), 18 | ('lizzes' -> [ [ 'moogRoot', 21.0 ], [ 'lpRatio', 40.380411650526 ], [ 'lfDepth', 32.912741206848 ], [ 'lfSpeed', 0.17227852429913 ], [ 'reso', 13.433526375872 ], [ 'strobe', 2.9032929038659 ], [ 'dense', 0.90080418244563 ] ]), 19 | ('speek' -> [ [ 'moogRoot', 31.0 ], [ 'lpRatio', 29.600768038635 ], [ 'lfDepth', 48.0 ], [ 'lfSpeed', 10.0 ], [ 'reso', 8.2163196206931 ], [ 'strobe', 1.8804665047879 ], [ 'dense', 0.75471102159028 ] ]) 20 | ] 21 | 22 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/varsawFB.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('varsawFB'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('varsawFB').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'width', 0.95652394890785 ], [ 'lagFreq', 2230.032851823 ], [ 'minFreq', 18.114366734934 ], [ 'maxFreq', 520.84612514157 ], [ 'freqDev', 0.10313434058696 ], [ 'freqRate', 1.9886385361304 ], [ 'dens', 0.77532716245539 ] ]), 12 | ('buzzzz' -> [ [ 'width', 0.95652394890785 ], [ 'lagFreq', 2230.032851823 ], [ 'minFreq', 18.114366734934 ], [ 'maxFreq', 520.84612514157 ], [ 'freqDev', 0.10313434058696 ], [ 'freqRate', 1.9886385361304 ], [ 'dens', 0.77532716245539 ] ]), 13 | ('sputta' -> [ [ 'width', 0.001 ], [ 'lagFreq', 4924.9369509647 ], [ 'minFreq', 1.0 ], [ 'maxFreq', 10027.336346286 ], [ 'freqDev', 0.25789588064327 ], [ 'freqRate', 0.010550833517665 ], [ 'dens', 1.0 ] ]), 14 | ('chowww' -> [ [ 'width', 0.41345483286182 ], [ 'lagFreq', 2570.0774315779 ], [ 'minFreq', 4.1967447131616 ], [ 'maxFreq', 20000.0 ], [ 'freqDev', 0.11119084958211 ], [ 'freqRate', 0.040409396744338 ], [ 'dens', 1.0 ] ]), 15 | ('skiddy' -> [ [ 'width', 0.20316700885131 ], [ 'lagFreq', 3889.0836321514 ], [ 'minFreq', 1.4084440175157 ], [ 'maxFreq', 20000.0 ], [ 'freqDev', 0.036948477388405 ], [ 'freqRate', 0.01 ], [ 'dens', 1.0 ] ]), 16 | ('copta' -> [ [ 'width', 0.87402292720073 ], [ 'lagFreq', 200.0 ], [ 'minFreq', 1.0 ], [ 'maxFreq', 152.90146424974 ], [ 'freqDev', 0.11091714151627 ], [ 'freqRate', 10.977757723332 ], [ 'dens', 0.52989968556763 ] ]), 17 | ('spurrr' -> [ [ 'width', 0.60897931819585 ], [ 'lagFreq', 841.47080311207 ], [ 'minFreq', 1.5413078044914 ], [ 'maxFreq', 6820.5936187611 ], [ 'freqDev', 0.25692390261887 ], [ 'freqRate', 0.43649410024321 ], [ 'dens', 0.78229857104477 ] ]), 18 | ('explo' -> [ [ 'width', 0.88049755786341 ], [ 'lagFreq', 314.02019903332 ], [ 'minFreq', 1.1293878289701 ], [ 'maxFreq', 20000.0 ], [ 'freqDev', 0.23635549047254 ], [ 'freqRate', 0.76618693278669 ], [ 'dens', 0.58975205317968 ] ]), 19 | ('moto' -> [ [ 'width', 0.89510548909754 ], [ 'lagFreq', 504.90086337569 ], [ 'minFreq', 1.0 ], [ 'maxFreq', 3165.1489433118 ], [ 'freqDev', 0.014613055634493 ], [ 'freqRate', 0.17231808724679 ], [ 'dens', 1.0 ] ]), 20 | ('hummmm' -> [ [ 'width', 0.6097831554314 ], [ 'lagFreq', 894.75852108564 ], [ 'minFreq', 41.558870376231 ], [ 'maxFreq', 56.09258474535 ], [ 'freqDev', 0.038189436039065 ], [ 'freqRate', 0.39301591419811 ], [ 'dens', 1.0 ] ]) 21 | ] 22 | 23 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/vowel.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('vowel'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('vowel').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'freqDev', 1.3427315935281 ], [ 'ffreq', 5.0871522377689 ], [ 'distort', 0.61056414256743 ], [ 'fold', 0.13682181049274 ], [ 'pan', -0.9261302947998 ] ]), 12 | ('trigs' -> [ [ 'freqDev', 1.3427315935281 ], [ 'ffreq', 5.0871522377689 ], [ 'distort', 0.61056414256743 ], [ 'fold', 0.13682181049274 ], [ 'pan', 0.058201058201058 ] ]), 13 | ('breeeh' -> [ [ 'freqDev', 1.7041485277259 ], [ 'ffreq', 19.115351387615 ], [ 'distort', 0.62060810486258 ], [ 'fold', 0.21348935817059 ], [ 'pan', 0.48051786811898 ] ]), 14 | ('motoa' -> [ [ 'freqDev', 2.9016875602562 ], [ 'ffreq', 5.7764875957922 ], [ 'distort', 0.14351036490651 ], [ 'fold', 0.35575850775461 ], [ 'pan', 0.3622190952301 ] ]), 15 | ('woods' -> [ [ 'freqDev', 0.5224027037065 ], [ 'ffreq', 8.8497658211332 ], [ 'distort', 0.22590762658776 ], [ 'fold', 0.065322473871003 ], [ 'pan', 0.46354309276558 ] ]), 16 | ('kriket' -> [ [ 'freqDev', 1.3617803002552 ], [ 'ffreq', 44.558279552399 ], [ 'distort', 10.0 ], [ 'fold', 0.46911727854354 ], [ 'pan', -0.047619047619048 ] ]) 17 | ] 18 | 19 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/wsetta.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('wsetta'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('wsetta').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'num', 14.0 ], [ 'repeats', 9.0 ], [ 'progress', 73.0 ], [ 'legato', 9.795799355832 ], [ 'rate', 1.0257621818438 ], [ 'rate2', 0.85749148872547 ], [ 'pan', -0.46174073942785 ], [ 'wsamp', 0.92709935346687 ] ]), 12 | ('adc_210624_164208' -> [ [ 'num', 3.0 ], [ 'repeats', 5.0 ], [ 'progress', 38.0 ], [ 'legato', 1.5874482241638 ], [ 'rate', 0.27953531202574 ], [ 'rate2', 0.77431670807721 ], [ 'pan', 0.34017940077616 ], [ 'wsamp', 0.57433411024511 ] ]), 13 | ('downhill' -> [ [ 'num', 14.0 ], [ 'repeats', 9.0 ], [ 'progress', 73.0 ], [ 'legato', 9.795799355832 ], [ 'rate', 1.0257621818438 ], [ 'rate2', 0.63927002548262 ], [ 'pan', -0.46174073942785 ], [ 'wsamp', 0.92709935346687 ] ]), 14 | ('loopy' -> [ [ 'num', 7.0 ], [ 'repeats', 14.0 ], [ 'progress', 14.0 ], [ 'legato', 5.3416667880699 ], [ 'rate', 0.6688542102215 ], [ 'rate2', 1.5555800165402 ], [ 'pan', -0.25076754615185 ], [ 'wsamp', 0.55268855300015 ] ]), 15 | ('bubbly' -> [ [ 'num', 16.0 ], [ 'repeats', 4.0 ], [ 'progress', 6.0 ], [ 'legato', 1.2179924328918 ], [ 'rate', 0.72949679504911 ], [ 'rate2', 1.8653817390421 ], [ 'pan', -0.56463908438379 ], [ 'wsamp', 0.77926930105731 ] ]), 16 | ('orig' -> [ [ 'num', 10 ], [ 'repeats', 1 ], [ 'progress', 10 ], [ 'legato', 1 ], [ 'rate', 1 ], [ 'rate2', 1 ], [ 'pan', 0 ], [ 'wsamp', 0.25 ] ]) 17 | ] 18 | 19 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/xf-bufFun.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('xf-bufFun'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('xf-bufFun').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'newLvl', 0.84125202492276 ], [ 'oldLvl', 0.35531561445547 ], [ 'secs', 0.11135131289039 ], [ 'pitch1', 7.75 ], [ 'pitch2', -7.75 ], [ 'flip', 0.0 ], [ 'freeze', 0.0 ], [ 'lag', 0.40705533014272 ] ]), 12 | ('khoor' -> [ [ 'newLvl', 0.84125202492276 ], [ 'oldLvl', 0.35531561445547 ], [ 'secs', 0.87457879207569 ], [ 'pitch1', 7.75 ], [ 'pitch2', -7.75 ], [ 'flip', 1.0 ], [ 'freeze', 0.0 ], [ 'lag', 0.40705533014272 ] ]), 13 | ('klopfgeist' -> [ [ 'newLvl', 0.81602248206703 ], [ 'oldLvl', 0.56436942094557 ], [ 'secs', 1.0879261044932 ], [ 'pitch1', 1.75 ], [ 'pitch2', 33.75 ], [ 'flip', 1.0 ], [ 'freeze', 0.0 ], [ 'lag', 0.38789695720986 ] ]), 14 | ('lahm' -> [ [ 'newLvl', 0.96670395488256 ], [ 'oldLvl', 0.34572959122515 ], [ 'secs', 3.2502927280898 ], [ 'pitch1', 7.0 ], [ 'pitch2', -10.5 ], [ 'flip', 1.0 ], [ 'freeze', 0.0 ], [ 'lag', 0.10604108609139 ] ]), 15 | ('lotz' -> [ [ 'newLvl', 0.91440319380491 ], [ 'oldLvl', 0.82819629909577 ], [ 'secs', 4.9331201494198 ], [ 'pitch1', 26.75 ], [ 'pitch2', 3.5 ], [ 'flip', 1.0 ], [ 'freeze', 0.0 ], [ 'lag', 0.43477222677693 ] ]) 16 | ] 17 | 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/xf-ringMod.pxpreset.scd: -------------------------------------------------------------------------------- 1 | /* 2 | ///// These are the settings for NdefPreset('xf-ringMod'): 3 | ///// you can edit the textfile, e.g. choosing better preset names, 4 | ///// tuning parameter values, or deleting unwanted presets. 5 | ///// When done, save the textfile where it is, and 6 | ///// then load the edited settings again with: 7 | NdefPreset('xf-ringMod').loadSettings(clear: true); 8 | */ 9 | 10 | List[ 11 | ('curr' -> [ [ 'oct', 2 ], [ 'which', 0 ], [ 'pow', 1 ] ]) 12 | ] 13 | 14 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/allArm.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'divefreq', 0.05 ], [ 'topfreq', 912.0 ], [ 'filtfreq', 41.0 ] ]), ('set1' -> [ [ 'divefreq', 20.0 ], [ 'topfreq', 67270.0 ], [ 'filtfreq', 136.0 ] ]), ('set2' -> [ [ 'divefreq', 12.97 ], [ 'topfreq', 912.0 ], [ 'filtfreq', 25599.0 ] ]), ('doak' -> [ [ 'divefreq', 0.06 ], [ 'topfreq', 49176.0 ], [ 'filtfreq', 2986.0 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/cat.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ 2 | ('curr' -> [ [ 'filt', 1.4650374694494 ], [ 'moDepth', 53.428608405718 ], [ 'modFreq', 0.019812823177072 ], [ 'pFreq', 296.53626832009 ], [ 'pWidth', 0.10032550394415 ], [ 'q', 5.3058937953291 ] ]), 3 | ('set1' -> [ [ 'pFreq', 122.58499103809 ], [ 'pWidth', 0.0692519681415 ], [ 'filt', 9.2904652019561 ], [ 'q', 43.384350182843 ], [ 'modFreq', 12.853013595319 ], [ 'moDepth', 40.301969396669 ] ]), 4 | ('set3' -> [ [ 'pFreq', 149.51739673339 ], [ 'pWidth', 0.5 ], [ 'filt', 26.416128303128 ], [ 'q', 998.42018950599 ], [ 'modFreq', 79.171847430283 ], [ 'moDepth', 59.549213790894 ] ]), 5 | ('yuZ' -> [ [ 'pFreq', 42.035238205557 ], [ 'pWidth', 0.023438438594205 ], [ 'filt', 11.833916381623 ], [ 'q', 54.266384591876 ], [ 'modFreq', 4.2781678393392 ], [ 'moDepth', 72.370594920166 ] ]), 6 | ('katz' -> [ [ 'pFreq', 68.562131881781 ], [ 'pWidth', 0.12126468582817 ], [ 'filt', 7.0785719454297 ], [ 'q', 30.526897700708 ], [ 'modFreq', 8.2068466972401 ], [ 'moDepth', 45.644851212919 ] ]), 7 | ('I am' -> [ [ 'filt', 2.6845540912992 ], [ 'moDepth', 75.965557633037 ], [ 'modFreq', 0.98335759492135 ], [ 'pFreq', 83.856273897753 ], [ 'pWidth', 0.020825043610865 ], [ 'q', 18.415532534626 ] ]), 8 | ('zelda' -> [ [ 'filt', 10.982441244526 ], [ 'moDepth', 1.6212788651632 ], [ 'modFreq', 1.7079490053369 ], [ 'pFreq', 75.148398072444 ], [ 'pWidth', 0.17197515367996 ], [ 'q', 104.3762501889 ] ]), 9 | ('woreme' -> [ [ 'filt', 7.2165893521089 ], [ 'moDepth', 5.6475610609069 ], [ 'modFreq', 5.3339924072477 ], [ 'pFreq', 46.552989534663 ], [ 'pWidth', 0.087341414794079 ], [ 'q', 210.18761595145 ] ]) 10 | ] 11 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/envelo.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'freq', 8257.1279059761 ], [ 'intv', 14.687977852065 ], [ 'timescale', 0.29811915110156 ], [ 'curve', 9.2879419899916 ], [ 'loopnode', 4.0 ], [ 'formfact', 0.65260790896508 ], [ 'widfact', 8.7962818476082 ], [ 'spread', 0.27400498833952 ] ]), ('wombba' -> [ [ 'freq', 106.64584473874 ], [ 'intv', 25.557659621614 ], [ 'timescale', 0.10981144539749 ], [ 'curve', 2.3895398534432 ], [ 'loopnode', 0.0 ], [ 'formfact', 1.2831442877367 ], [ 'widfact', 1.1064105413532 ], [ 'spread', 0.91943672150991 ] ]), ('Operator' -> [ [ 'freq', 134.59141372727 ], [ 'intv', 16.863884838473 ], [ 'timescale', 0.016590356155991 ], [ 'curve', 9.853271092615 ], [ 'loopnode', 1.0 ], [ 'formfact', 0.32085135679428 ], [ 'widfact', 6.26775075279 ], [ 'spread', 0.6939678247869 ] ]), ('dududu' -> [ [ 'freq', 124.36002174642 ], [ 'intv', 25.557659621614 ], [ 'timescale', 0.10981144539749 ], [ 'curve', 2.3895398534432 ], [ 'loopnode', 7.0 ], [ 'formfact', 1.2831442877367 ], [ 'widfact', 1.1064105413532 ], [ 'spread', 0.91943672150991 ] ]), ('byond' -> [ [ 'freq', 53.892566286322 ], [ 'intv', 31.099223095123 ], [ 'timescale', 0.15039592924792 ], [ 'curve', -0.5256991213824 ], [ 'loopnode', 4.0 ], [ 'formfact', 5.9115540405171 ], [ 'widfact', 0.33607998906669 ], [ 'spread', 0.9521838953024 ] ]), ('3/2' -> [ [ 'freq', 187.91669387445 ], [ 'intv', 19.195871753697 ], [ 'timescale', 0.19105001950011 ], [ 'curve', -0.73205135531161 ], [ 'loopnode', 1.0 ], [ 'formfact', 0.75847223283726 ], [ 'widfact', 3.4295446897986 ], [ 'spread', 0.8993038400581 ] ]), ('streche' -> [ [ 'freq', 577.46318722892 ], [ 'intv', 17.789393497939 ], [ 'timescale', 0.48343950959551 ], [ 'curve', -1.8973821210416 ], [ 'loopnode', 2.0 ], [ 'formfact', 0.60580324467153 ], [ 'widfact', 3.7038313467358 ], [ 'spread', 0.76458141557113 ] ]), ('underground' -> [ [ 'freq', 56.270178629309 ], [ 'intv', 6.997690510075 ], [ 'timescale', 0.41249240387662 ], [ 'curve', -3.6428266335262 ], [ 'loopnode', 4.0 ], [ 'formfact', 1.5690760948882 ], [ 'widfact', 1.6634248834654 ], [ 'spread', 0.66584222778595 ] ]), ('down' -> [ [ 'freq', 27.789909887463 ], [ 'intv', 18.266235085818 ], [ 'timescale', 2.6927351622671 ], [ 'curve', 4.2667609831988 ], [ 'loopnode', 6.0 ], [ 'formfact', 2.358182753801 ], [ 'widfact', 1.6497447977607 ], [ 'spread', 0.41291894685268 ] ]), ('quick' -> [ [ 'freq', 4194.7853769333 ], [ 'intv', 21.712307114554 ], [ 'timescale', 0.063456964874086 ], [ 'curve', -6.5726141294895 ], [ 'loopnode', 4.0 ], [ 'formfact', 3.6943691870979 ], [ 'widfact', 1.4572556383585 ], [ 'spread', 0.80166083120043 ] ]), ('auoo' -> [ [ 'freq', 201.75393087603 ], [ 'intv', 23.671838815405 ], [ 'timescale', 10.0 ], [ 'curve', 2.2162996346178 ], [ 'loopnode', 4.0 ], [ 'formfact', 10.0 ], [ 'widfact', 0.89080816508323 ], [ 'spread', 0.55343960293302 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/kiteHi.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'ffreq', 16652.008295059 ], [ 'move', 1.4628064275615 ], [ 'hack', 7.52047961793 ], [ 'dustfreq', 6107.1197258268 ], [ 'width', 0.96248259858895 ], [ 'lag', 0.32401107424398 ] ]), ('wuzl' -> [ [ 'ffreq', 1620.4742193222 ], [ 'move', 10.387440572754 ], [ 'hack', 3.1872674095138 ], [ 'dustfreq', 814.50152729014 ], [ 'width', 0.21847083884931 ], [ 'lag', 1.5449539038944 ] ]), ('traeller' -> [ [ 'ffreq', 3160.4690551758 ], [ 'move', 0.22708083693073 ], [ 'hack', 14.729084248692 ], [ 'dustfreq', 1679.3216756762 ], [ 'width', 0.027743799344376 ], [ 'lag', 0.27952753991245 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/micDelay.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'delayMin', 0.33698485826743 ], [ 'delayMax', 0.064948450169649 ], [ 'speed', 0.89815538423846 ], [ 'feedback', 0.2148311039587 ], [ 'transpose', -1.8043590545654 ], [ 'laG', 0.049076289757255 ] ]), ('set1' -> [ [ 'delayMin', 0.11483888212716 ], [ 'delayMax', 0.22346337269166 ], [ 'speed', 0.24594509307239 ], [ 'feedback', 0.13570247938245 ], [ 'transpose', 6.0144910733873 ], [ 'laG', 0.23295363737566 ] ]), ('set2' -> [ [ 'delayMin', 0.2550286052306 ], [ 'delayMax', 0.31790946109565 ], [ 'speed', 0.18166845842441 ], [ 'feedback', 0.38183488347318 ], [ 'transpose', 5.664734634606 ], [ 'laG', 3.2833850863925 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/moogSing.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'moogRoot', 39.0 ], [ 'lpRatio', 30.532663917819 ], [ 'lfDepth', 31.132390523122 ], [ 'lfSpeed', 2.5452387905468 ], [ 'reso', 7.0390555242937 ], [ 'strobe', 1.7217534613645 ], [ 'dense', 0.94141330794096 ] ]), ('ru' -> [ [ 'moogRoot', 24 ], [ 'lpRatio', 36 ], [ 'lfDepth', 24 ], [ 'lfSpeed', 0.35 ], [ 'reso', 47.618726630085 ], [ 'strobe', 1.9171544822905 ], [ 'dense', 0.883245 ] ]), ('dumpf' -> [ [ 'moogRoot', 37.5 ], [ 'lpRatio', 21.672437667847 ], [ 'lfDepth', 18.785761717116 ], [ 'lfSpeed', 0.024969490316016 ], [ 'reso', 47.163358845612 ], [ 'strobe', 8.0838154754602 ], [ 'dense', 0.72472774904966 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/presets/z_BK/revFB.pxpreset_BK.scd: -------------------------------------------------------------------------------- 1 | List[ ('curr' -> [ [ 'direct', 0.16761850019975 ], [ 'feedback', 0.419358444061 ], [ 'revTime', 29.305200327258 ], [ 'animRate', 1.7060594161467 ], [ 'animDepth', 5.3351214774011e-05 ], [ 'hfDamping', 0.46444571018219 ], [ 'predelay', 0.021351201357405 ], [ 'inFilter', 0.62885250806808 ], [ 'leakCoeff', 0.92803739404678 ], [ 'combScale', 0.34510605221903 ] ]), ('doak' -> [ [ 'direct', 0.68430737225254 ], [ 'feedback', 0.16602685826755 ], [ 'revTime', 38.295379558025 ], [ 'animRate', 0.67009988814259 ], [ 'animDepth', 0.019710797991922 ], [ 'hfDamping', 0.27859036922455 ], [ 'predelay', 0.19670433652549 ], [ 'inFilter', -0.55200934553146 ], [ 'leakCoeff', 0.97972844772339 ], [ 'combScale', 1.7882059616813 ] ]), ('warb' -> [ [ 'direct', 0.38525674209945 ], [ 'feedback', 0.36838826813704 ], [ 'revTime', 77.015067226905 ], [ 'animRate', 0.16838878560908 ], [ 'animDepth', 1.0 ], [ 'hfDamping', 0.21750332446809 ], [ 'predelay', 0.10083841174477 ], [ 'inFilter', 0.66726040220261 ], [ 'leakCoeff', 0.9 ], [ 'combScale', 0.24521174611968 ] ]), ('miz' -> [ [ 'direct', 0.99265813978617 ], [ 'feedback', 0.5 ], [ 'revTime', 3.9725479586307 ], [ 'animRate', 0.48186885418299 ], [ 'animDepth', 0.66113577281905 ], [ 'hfDamping', 0.24467780310724 ], [ 'predelay', 0.023566077304631 ], [ 'inFilter', -0.4408401905728 ], [ 'leakCoeff', 0.96885725709005 ], [ 'combScale', 1.5860707051707 ] ]), ('slolo' -> [ [ 'direct', 0.38525674209945 ], [ 'feedback', 0.36838826813704 ], [ 'revTime', 2.3469939391614 ], [ 'animRate', 0.16838878560908 ], [ 'animDepth', 1.0 ], [ 'hfDamping', 0.21750332446809 ], [ 'predelay', 0.10083841174477 ], [ 'inFilter', 0.66726040220261 ], [ 'leakCoeff', 0.9 ], [ 'combScale', 0.24521174611968 ] ]), ('tzt' -> [ [ 'direct', 0.68430737225254 ], [ 'feedback', 0.16602685826755 ], [ 'revTime', 38.295379558025 ], [ 'animRate', 0.67009988814259 ], [ 'animDepth', 0.60493827160494 ], [ 'hfDamping', 0.64444444444444 ], [ 'predelay', 0.035654320987654 ], [ 'inFilter', 0.231 ], [ 'leakCoeff', 0.96315555555556 ], [ 'combScale', 1.7882059616813 ] ]), ('testo' -> [ [ 'direct', 0.68430737225254 ], [ 'feedback', 0.16602685826755 ], [ 'revTime', 38.295379558025 ], [ 'animRate', 0.67009988814259 ], [ 'animDepth', 0.019710797991922 ], [ 'hfDamping', 0.27859036922455 ], [ 'predelay', 0.19670433652549 ], [ 'inFilter', -0.55200934553146 ], [ 'leakCoeff', 0.97972844772339 ], [ 'combScale', 1.7882059616813 ] ]), ('allDIRECT' -> [ [ 'direct', 1.0 ], [ 'feedback', 0.0 ], [ 'revTime', 6.5854046272416 ], [ 'animRate', 0.19372243933995 ], [ 'animDepth', 0.88270407620639 ], [ 'hfDamping', 0.23481380373678 ], [ 'predelay', 0.10148339575788 ], [ 'inFilter', 0.56527385360578 ], [ 'leakCoeff', 0.90769452301424 ], [ 'combScale', 0.30155821719054 ] ]) ] -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/pulselet.scd: -------------------------------------------------------------------------------- 1 | /******* 2 | Pulselet is a very simple variant of pulsar synthesis, adc 2021 3 | + Like Pulsar Generator, has fundamental freq and 3 pulse trains with form, amp, pan 4 | + uses Formlet resonator for sinewave with simple Decay2 envelope 5 | + new: random coinGate pulse reduction 6 | + new: spread introduces phase shift between pulse trains 7 | 8 | Ndef(\pulselet).clear; 9 | Ndef(\pulselet).gui; 10 | Ndef(\pulselet).play; 11 | */ 12 | 13 | Ndef(\pulselet).addSpec(\fund, [1, 4000, \exp]); 14 | Ndef(\pulselet).addSpec(\spread, \bipolar); 15 | Ndef(\pulselet).addSpec(\coinDrop, [0, 2]); 16 | Ndef(\pulselet).addSpec(\decay, [1, 16, \exp]); 17 | 18 | Ndef(\pulselet).addSpec(\form1, [25, 10000, \exp]); 19 | Ndef(\pulselet).addSpec(\form2, [25, 10000, \exp]); 20 | Ndef(\pulselet).addSpec(\form3, [25, 10000, \exp]); 21 | 22 | Ndef(\pulselet).addSpec(\amp1, \bipolar); 23 | Ndef(\pulselet).addSpec(\amp2, \bipolar); 24 | Ndef(\pulselet).addSpec(\amp3, \bipolar); 25 | Ndef(\pulselet).addSpec(\pan1, \bipolar); 26 | Ndef(\pulselet).addSpec(\pan2, \bipolar); 27 | Ndef(\pulselet).addSpec(\pan3, \bipolar); 28 | 29 | 30 | ( 31 | // modulating formant frequency 32 | Ndef(\pulselet, { arg amp=0, 33 | fund=20, spread = 0, coinDrop = 1, decay = 4, 34 | form1 = 166.67, form2 = 500, form3 = 1500, 35 | amp1 = 0.33, amp2 = 0.33, amp3 = 0.33, 36 | pan1 = 0, pan2 = 0, pan3 = 0; 37 | // burst1, burst2, burstOn, spread; 38 | 39 | var formfreqs = [form1, form2, form3]; 40 | var formtimes = 1/formfreqs; 41 | var trig = Impulse.ar(fund, (spread * ([0, 1, 2] / 3))); 42 | var trig2 = CoinGate.ar(coinDrop, trig); 43 | var formz = Formlet.ar(trig2, formfreqs, formtimes * decay * 0.1, formtimes * decay); 44 | var panz; 45 | // expand to multichans 46 | if (q.numChans ? 2 > 2) { 47 | panz = PanAz.ar(q.numChans, formz, [pan1, pan2, pan3], [amp1, amp2, amp3]); 48 | } { 49 | panz = Pan2.ar(formz, [pan1, pan2, pan3], [amp1, amp2, amp3]) 50 | }; 51 | // 52 | (panz.sum * amp.lag(0.1)).tanh; 53 | }); 54 | ); 55 | 56 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/torus.scd: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Concept by Shuoxin Tan & Joseph Baader 4 | Implementation by Shuoxin Tan & Joseph Baader & Bruno Gola in 2024 5 | 6 | */ 7 | 8 | ( 9 | var maxDens = 40; 10 | Ndef(\torus).addSpec(\stretch, [1, 600, \exp]); 11 | Ndef(\torus).addSpec(\shift, [1, 3000, \exp]); 12 | Ndef(\torus).addSpec(\trigRate, [0.7, 700, \exp]); 13 | Ndef(\torus).addSpec(\att, [0.001, 3, \exp]); 14 | Ndef(\torus).addSpec(\rel, [0.001, 3, \exp]); 15 | Ndef(\torus).addSpec(\dens, [3, maxDens, \lin]); 16 | 17 | Ndef(\torus, { arg amp = 0.5, dens = 6, trigRate=8, att=0.012, rel=0.024, stretch=342, shift=1300; 18 | var circle = maxDens.collect {|n| [cos(2pi*n/dens.floor), sin(2pi*n/dens.floor)]}; 19 | var seq = [circle, circle].allTuples; 20 | var trig = Impulse.kr(trigRate); // rate of oscillating through the torus 21 | var indx = Stepper.kr(trig, 0, 0, (dens.floor.pow(2)-1)); 22 | var env = EnvGen.ar(Env.perc(att, rel), trig); 23 | var frq = Select.kr(indx, seq); 24 | var sig = SinOsc.ar(2 + frq * stretch + shift + 50).sum * env; 25 | sig * amp; 26 | }) 27 | ) 28 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/unused/etude.scd: -------------------------------------------------------------------------------- 1 | 2 | 3 | /* 4 | // Hannes example for writing Ndefs step by step 5 | 6 | Ndef(\etude).document; 7 | 8 | // compare that we have all the specs, except globals like \amp: 9 | Ndef(\etude).controlKeys 10 | Ndef(\etude).getSpec.keys 11 | 12 | Ndef(\etude).edit(8); 13 | Ndef(\etude).play; 14 | 15 | // gobal for old NanoKtl 16 | Spec.add(\bpm, [12, 1200, \exp, 1]); 17 | Spec.add(\att, [0, 0.2, 5]); 18 | Spec.add(\dcy, [0.01, 1, 5]); 19 | Spec.add(\ffreq, \freq); 20 | Spec.add(\reso, [1, 100, \exp]); 21 | Spec.add(\mod, \amp); 22 | 23 | */ 24 | 25 | 26 | Ndef(\etude).addSpec(\bpm, [12, 1200, \exp, 1]); 27 | Ndef(\etude).addSpec(\att, [0, 0.2, 5]); 28 | Ndef(\etude).addSpec(\dcy, [0.01, 1, 5]); 29 | Ndef(\etude).addSpec(\ffreq, \freq); 30 | Ndef(\etude).addSpec(\reso, [1, 100, \exp]); 31 | Ndef(\etude).addSpec(\mod, \amp); 32 | 33 | // gobal for old NanoKtl 34 | Ndef(\etude).addSpec(\bpm, [12, 1200, \exp, 1]); 35 | Ndef(\etude).addSpec(\att, [0, 0.2, 5]); 36 | Ndef(\etude).addSpec(\dcy, [0.01, 1, 5]); 37 | Ndef(\etude).addSpec(\ffreq, \freq); 38 | Ndef(\etude).addSpec(\reso, [1, 100, \exp]); 39 | Ndef(\etude).addSpec(\mod, \amp); 40 | 41 | 42 | // the Ndef iself 43 | Ndef(\etude, { arg amp=0, bpm=120, att=0.002, dcy=0.05, ffreq=5000, reso=2, mod=0.2; 44 | var metro = Impulse.ar(bpm/60); 45 | var env = Decay2.ar(metro, att, dcy); 46 | var sig = GrayNoise.ar(amp.dup); 47 | sig = env * sig; 48 | ffreq = ((mod*env+1) * ffreq).clip(20, 20000); 49 | sig = RLPF.ar(sig, ffreq, 1/reso); 50 | Limiter.ar(sig, amp); 51 | }); 52 | 53 | fork { s.sync; 0.1.wait; Ndef(\etude).end }; 54 | Ndef(\etude); 55 | 56 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/unused/gendy3.scd: -------------------------------------------------------------------------------- 1 | /*** 2 | WARNING: 3 | **** Gendy3 is often goes into NaN-areas on macOS 12.4, 4 | so we take it out for now. **** 5 | 6 | gendy3 example patch: 7 | use Gendy3 oscillator for modulation and synthesis, 8 | Gendy3 forces pitch to the desired value, which is counter-xenakis. 9 | 10 | 11 | ampdist, durdist have 7 possible distributions: 12 | 0: LINEAR. 13 | 1: CAUCHY. 14 | 2: LOGIST. 15 | 3: HYPERBCOS. 16 | 4: ARCSINE. 17 | 5: EXPON. 18 | 6: SINUS. 19 | 20 | Ndef(\gendy3).clear; 21 | */ 22 | 23 | Ndef(\gendy3).addSpec(\dist, [0, 7]); 24 | Ndef(\gendy3).addSpec(\addd, [0.0001, 1, \exp]); 25 | Ndef(\gendy3).addSpec(\minfreq, [2, 200, \exp]); 26 | Ndef(\gendy3).addSpec(\maxfreq, [20, 1000, \exp]); 27 | Ndef(\gendy3).addSpec(\ascale, [0.1, 2, \exp]); 28 | Ndef(\gendy3).addSpec(\dscale, [0.1, 2, \exp]); 29 | 30 | Ndef(\gendy3, { |amp = 0, dist = 3, addd = 0.01, minfreq = 30, maxfreq = 6000, 31 | ascale = 1, dscale = 1| 32 | var n = q.numChans ? 2; 33 | var freq = LFDNoise3.kr(minfreq * 0.01).exprange(minfreq, maxfreq); 34 | // var dist = Rand(0, 7); // choose new random distrib when running 35 | // var addd = exprand(0.001, 1); // choose new random distrib when running 36 | 37 | var mods = Gendy3.kr(dist!n, dist, addd, addd, freq * 0.1, ascale, dscale).exprange(0.001, 0.1); 38 | var snds = Gendy3.ar(dist!n, dist, addd, addd, freq, mods, mods); 39 | 40 | snds * amp.lag; 41 | }); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/unused/tdefNdef.scd: -------------------------------------------------------------------------------- 1 | /* uncomment top and bottom comment to try this ... 2 | 3 | /*** EXAMPLE FOR TDEF-NDEF-COMBO THAT WORKS IN NTMI SETUP ****/ 4 | 5 | /*** 6 | // TESTS: 7 | // Ndef starts tdef, tdef sounds 8 | Ndef('tdefNdef').play; 9 | // Tdef sounds controlled by Ndef vol 10 | Ndef('tdefNdef').vol = 0.5; 11 | // end ends Ndef and stops Tdef fully 12 | Ndef('tdefNdef').end; // end sound and tdef 13 | 14 | // set params by hand: 15 | // note center of random range: 16 | Ndef('tdefNdef').set(\note, 24.rand2); 17 | // amount of random deviation 18 | Ndef('tdefNdef').set(\notedev, 24.rand); 19 | 20 | Ndef('tdefNdef').set(\pan, 1.0); 21 | Ndef('tdefNdef').set(\amp, 0.3); 22 | 23 | ***/ 24 | 25 | //////// SETUP CODE: ////// 26 | 27 | // Ndef has all the params 28 | 29 | Ndef('tdefNdef').set(\rate, 8); 30 | Ndef('tdefNdef').set(\note, 0); 31 | Ndef('tdefNdef').set(\notedev, 8); 32 | Ndef('tdefNdef').set(\pan, 0.5); 33 | Ndef('tdefNdef').set(\amp, 0.2); 34 | 35 | Ndef('tdefNdef').addSpec(\rate, [1, 64, \exp]); 36 | Ndef('tdefNdef').addSpec(\note, [-36, 36]); 37 | Ndef('tdefNdef').addSpec(\notedev, [0, 24]); 38 | 39 | // ndef plays on q.numChans audio chans 40 | Ndef('tdefNdef').ar(q.numChans); 41 | // source is the same-named Tdef 42 | Ndef('tdefNdef', Tdef('tdefNdef')); 43 | 44 | // this second object sets the params to use for ntmi/influx: 45 | // silent sound output for now, 46 | // could also be post-processing of sounds from tdef? 47 | Ndef('tdefNdef').put(5, { |amp, note = 0, notedev = 12, rate = 4, pan | 48 | Silent.ar(2); 49 | }); 50 | 51 | 52 | ///// Tdef plays the sounds (events) onto the Ndef bus; 53 | //// reads its params from the Ndef; 54 | //// and gets started/ended from the Ndef; 55 | 56 | Tdef('tdefNdef', { 57 | var myndef = Ndef('tdefNdef'); 58 | var mymap = myndef.nodeMap; 59 | inf.do { |i| 60 | ( 61 | note: mymap.at(\note) + mymap.at(\notedev).rand2, 62 | amp: mymap.get(\amp), 63 | pan: mymap.get(\pan).rand2.round(0.01), 64 | dur: (1/mymap.at(\rate)), 65 | 66 | out: myndef.index, 67 | ).play; 68 | (1/mymap.at(\rate)).wait; 69 | } 70 | }); 71 | 72 | // setup as in all NTMI processes: 73 | // init once, then end process again 74 | fork { s.sync; 0.1.wait; Ndef(\tdefNdef).end }; 75 | 76 | // ... and return the Ndef 77 | Ndef(\tdefNdef); 78 | 79 | */ 80 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/unused/xf-jetSet.scd: -------------------------------------------------------------------------------- 1 | Ndef('xf-jetSet').addSpec(\freqMul, [0.75, 8, \exp] ); 2 | Ndef('xf-jetSet').addSpec(\dGain, [0, 5, \amp] ); 3 | Ndef('xf-jetSet').addSpec(\fFreq, [200, 10000, \exp] ); 4 | Ndef('xf-jetSet').addSpec(\filterF, [200, 10000, \exp] ); 5 | Ndef('xf-jetSet').addSpec(\wCut, [250, 4000, \lin] ); 6 | Ndef('xf-jetSet').addSpec(\cclip, [0.1, 1, \lin] ); 7 | Ndef('xf-jetSet').addSpec(\delT, [0.05, 1, 4] ); 8 | Ndef('xf-jetSet').addSpec(\delfreq, [5, 50, \lin] ); 9 | // Ndef('xf-jetSet').addSpec(\amp,\amp ); 10 | 11 | Ndef('xf-jetSet', { | amp=0.1, freqMul=1, dGain=1, fFreq=200, wCut=2200, cclip=1, delT=0.2, delfreq = 20 ,filterF=10000| 12 | // get fed back signal and add a little noise to get things going 13 | var inChan=0, sig, delay, minfreqs, freqs, combF, hpf, lpf, filter,wha, dry, distort; 14 | 15 | var in = q.liveInput.ar(1);//+ WhiteNoise.ar(0.001!2) + Dust.ar(8!2, 30).lag(0.01); 16 | // delay due to distance from amp - I chose 0.05s, or 20Hz 17 | delay = DelayN.ar(in,1/10-ControlDur.ir,1/delfreq-ControlDur.ir.lag(0.1)); 18 | 19 | // guitar string frequencies 20 | // a few octaves to get a good sound. 21 | // open strings 22 | //freqs = (84+[0,5,10,15,19,24]).midicps/8; 23 | // e minor and other chords 24 | freqs = ((64+ 25 | [ [0,7,12,15,19,24], 26 | [0,4,12,15,18,24] + 3, 27 | [0, 3, 6, 8, 10, 22], 28 | // [0,7,12,15,19,24] 29 | ].choose.postln 30 | ).midicps/4); 31 | 32 | // whammy bar modulates freqs: 33 | minfreqs = freqs*0.5; 34 | freqs = freqs* freqMul.lag(0); 35 | 36 | // 6 comb filters emulate the strings' resonances 37 | combF = Splay.ar(CombN.ar( delay!6, 1/minfreqs, 1/freqs, 8 )); 38 | 39 | // a little filtering... 40 | lpf = LPF.ar(combF, filterF.lag(0.2)); 41 | hpf = HPF.ar(lpf * dGain.lag(0.2), 70); 42 | 43 | // and some not too harsh distortion 44 | filter = RLPFD.ar( hpf, fFreq.lag(1) * [1, 1.1], 0.1,0.5 ).flop.sum; 45 | sig = filter + filter.mean; 46 | 47 | // and spot of reverb 48 | dry = sig; 49 | 5.do { 50 | var d = 0.5.rand; 51 | sig = AllpassN.ar(sig, d, d * delT.lag(0.2), 1); 52 | }; 53 | sig = (dry + sig) * amp; 54 | sig = SVF.ar(sig, wCut.lag(0.4)); 55 | sig = sig.clip2(cclip) * cclip.reciprocal; 56 | sig = SVF.ar(sig, wCut.lag(0.6)); 57 | Limiter.ar(LeakDC.ar(sig, 0.997)); 58 | }); -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/varsawFB.scd: -------------------------------------------------------------------------------- 1 | // simple varsaw modulation network, adc&hh 2014 2 | // maybe add kr/lofreq VarSaws as strobes on the output? 3 | 4 | /* listening to \varsawFB: "Klatschen die alle?" - "nein, das klingt nur so" - "Und was klingt so wie grüne Augen, wie grünes Gras?" (JH) 5 | */ 6 | 7 | Ndef(\varsawFB).addSpec(\minFreq, [1, 20000, \exp]); 8 | Ndef(\varsawFB).addSpec(\maxFreq, \widefreq); 9 | Ndef(\varsawFB).addSpec(\width, [0.001, 0.999]); 10 | Ndef(\varsawFB).addSpec(\lagFreq, [200, 20000, \exp]); 11 | Ndef(\varsawFB).addSpec(\freqDev, [0, 1, \amp]); 12 | Ndef(\varsawFB).addSpec(\freqRate, [0.01, 100, \exp]); 13 | Ndef(\varsawFB).addSpec(\dens, [0.2, 1, 2]); 14 | 15 | // VarSaw, strobe variant: 16 | ( 17 | Ndef(\varsawFB, { |amp = 0.25, width = 0.5, 18 | lagFreq = 1000, minFreq = 0.1, maxFreq = 10000, 19 | freqDev = 0.25, freqRate = 0.3, dens=0.9| 20 | // 8 VarSaws controlling each others frequencies 21 | var num = 13; 22 | var saws = []; 23 | var mod = LocalIn.ar(1); 24 | var freq = mod.exprange(minFreq, maxFreq); 25 | var ampcomp = AmpComp.kr(freq, 100).min(1) * amp; 26 | var strobe; 27 | width = (width * 2 - 1) ** 0.25 + 1 * 0.5; 28 | 29 | num.do { |i| 30 | var num1 = num - 1; 31 | var freqMod = (2 ** LFDNoise3.kr(freqRate, freqDev)); 32 | var saw = VarSaw.ar(freq * freqMod, Rand(), width); 33 | // filter saw 34 | saw = saw.lag(1/lagFreq); 35 | saw = OnePole.ar(saw, 0.8 ** 1); 36 | mod = saw; 37 | saws = saws.add(saw); 38 | }; 39 | LocalOut.ar(saws.last); 40 | strobe = LPF.ar(saws, 3).clump(q.numChans).sum.abs < dens; 41 | LeakDC.ar(SplayAz.ar(q.numChans, saws) * strobe.lag(5/lagFreq, 10/lagFreq) * (ampcomp)); 42 | }) 43 | ); 44 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/vowel.scd: -------------------------------------------------------------------------------- 1 | Ndef(\vowel).addSpec(\distort, [0.01, 10, \exp]); 2 | Ndef(\vowel).addSpec(\ffreq, [5, 100, \exp]); 3 | Ndef(\vowel).addSpec(\freqDev, [0.1, 11, \exp]); 4 | Ndef(\vowel).addSpec(\fold, [0.005, 1, \exp]); 5 | 6 | ( 7 | Ndef(\vowel, { | amp , freqDev= 1.02,ffreq = 176, distort = 2, fold=1.4, pan= 0.6 | 8 | 9 | var env, gen, uuu, lfmod, for, sig, bal, ruin, out; 10 | lfmod = { LFDNoise3.ar(XLine.kr(1, 6, 2), XLine.kr( 0.001, 1, 2, 4), 0.501) }; 11 | uuu = Vowel(\u, \soprano) * distort.lag(1); 12 | for = Formants.ar( [ffreq.lag(0.4) * freqDev.reciprocal.lag(0.05), ffreq.lag(0.2) * freqDev.lag(0.2)] + lfmod, uuu, ampMods: 0.15) /** gen;*/; 13 | bal = Balance2.ar(for[0], for[1], pan); 14 | ruin = Clip.ar(bal, (-1* fold).lag(0.2), fold.lag(0.2)) ; 15 | sig = ruin * AmpComp.kr(ffreq.max(44)); 16 | sig = LeakDC.ar(sig)*amp; 17 | //out = OffsetOut.ar(0, ruin) 18 | }); 19 | ); 20 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/xFMSH.scd: -------------------------------------------------------------------------------- 1 | // nonstandard cross FM - Joker Nies style 2 | // hh ca. 2010... 3 | // 2019- made quad/MC 4 | 5 | // parameter range Specifications 6 | Ndef(\xFMSH).addSpec(\blend, [0, 1]); 7 | Ndef(\xFMSH).addSpec(\modA_B, [0, 6]); 8 | Ndef(\xFMSH).addSpec(\modB_A, [0, 6]); 9 | Ndef(\xFMSH).addSpec(\freqA, \widefreq); 10 | Ndef(\xFMSH).addSpec(\freqB, \widefreq); 11 | // Ndef(\xFMSH).addSpec(\modAB, \unipolar); 12 | // Ndef(\xFMSH).addSpec(\modBA, \unipolar); 13 | Ndef(\xFMSH).addSpec(\shape, [8, 1/8, \exp]); 14 | Ndef(\xFMSH).addSpec(\lag, [0, 5, 5]); 15 | 16 | // basic mapping notes 17 | Ndef(\xFMSH).addHalo(\gamePadMap, ( 18 | joyLX: \freqA, 19 | joyLY: \shape, 20 | joyRX: \modA_B, 21 | joyRY: \amp) 22 | ); 23 | ( 24 | // sound description in SC JITLib style: 25 | Ndef(\xFMSH, { |amp=0, freqA=440, freqB=44, modA_B=0.1, modB_A=0.9, shape=1, blend=0, lag=0.05| 26 | var sig, fb = LocalIn.ar(2); 27 | var sh = Latch.ar(fb, fb.reverse); 28 | var freqs = 2.pow([modB_A, modA_B].lag2(lag)).pow(sh) * [freqA, freqB].lag2(lag); 29 | var oscs = SinOsc.ar(freqs).pow(shape.lag(lag)); 30 | LocalOut.ar(oscs); 31 | sig = blend( 32 | oscs.product.dup, 33 | oscs, 34 | blend.lag(lag) 35 | ); 36 | sig.collect{|si, i| // multichannel expansion 37 | PanAz.ar(2, si, SinOsc.kr(Rand(0.1, 0.2), 0, Rand(1, 2)), amp) 38 | }.sum; 39 | }); 40 | ); 41 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/xf-bufFun.scd: -------------------------------------------------------------------------------- 1 | Ndef('xf-bufFun').addSpec(\pitch1, [-36, 36, 0, 1/4]); 2 | Ndef('xf-bufFun').addSpec(\pitch2, [-36, 36, 0, 1/4]); 3 | Ndef('xf-bufFun').addSpec(\newLvl, [0.8, 1, \amp]); 4 | Ndef('xf-bufFun').addSpec(\oldLvl, \amp); 5 | Ndef('xf-bufFun').addSpec(\lag, [0.02, 5, \exp]); 6 | Ndef('xf-bufFun').addSpec(\direct, \amp); 7 | Ndef('xf-bufFun').addSpec(\secs, [0.1, 10, \exp]); 8 | Ndef('xf-bufFun').addSpec(\flip, [0, 1, 0, 1]); 9 | Ndef('xf-bufFun').addSpec(\freeze, [0, 1, 3, 1]); 10 | 11 | 12 | Ndef('xf-bufFun', { arg amp=0.1, newLvl=1, oldLvl=0.1, secs=1, pitch1= -2, pitch2=1, flip=1, freeze=0, lag=1; 13 | var inChan=0, phaW, trans, env, sd, frams, bs, ot, usedframs, offs=0, phaR; 14 | var buf = LocalBuf.new(10 * SampleRate.ir, 2); 15 | // var in = SoundIn.ar(inChan); 16 | var in = q.liveInput.ar(1); 17 | ClearBuf(buf); 18 | frams = BufFrames.ir(buf); 19 | usedframs = BufSampleRate.ir(buf) * secs.max(0.0001); 20 | phaW = Phasor.ar(0, BufRateScale.kr(buf) * K2A.ar(1-freeze.clip(0,1)), 0, usedframs); 21 | phaR = Phasor.ar(0, 22 | BufRateScale.kr(buf) 23 | * (flip).madd(2, -1) 24 | * [pitch1, pitch2].midiratio.lag2(lag) , 25 | 0, usedframs 26 | ); 27 | sd = SampleDur.ir; 28 | bs = (SampleRate.ir / ControlRate.ir); 29 | 30 | ot = BufRd.ar(2, buf, // expands to twice stereo, thus: 31 | phaR % usedframs, 32 | 1, 4 33 | ) * [[1, 0.001], [0.001, 1 ]]; 34 | ot = ot.sum; // sum it up 35 | ot = Rotate2.ar(ot[0], ot[1], SinOsc.kr( (Amplitude.kr(in).squared * 2), 0, 3 ).wrap2(1) ); 36 | 37 | BufWr.ar( in*newLvl.squared.min(1).lag(0.5) 38 | + (ot * oldLvl.lag(0.7).cubed), buf, phaW); // loop rec into the buf 39 | ot * amp 40 | }); 41 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process/xf-ringMod.scd: -------------------------------------------------------------------------------- 1 | Ndef('xf-ringMod').addSpec(\oct, [-5, 5]); 2 | Ndef('xf-ringMod').addSpec(\which, [-2, 2]); 3 | Ndef('xf-ringMod').addSpec(\pow, [0.5, 8, \exp]); 4 | Ndef('xf-ringMod').ar(q.numChans); 5 | 6 | Ndef('xf-ringMod', { arg amp=0.1, oct=2, which=0, pow=1; 7 | var sines, p, hsf; 8 | var inChan=0; 9 | // var in = SoundIn.ar(inChan*amp); 10 | var in = q.liveInput.ar(1); 11 | p = Pitch.kr(in)[0]; 12 | sines = q.numChans.collect{|i| 13 | var sins = SinOsc.ar(2**(oct) * (2 ** [-2, -1, 0, 1, 2]) * p, LFNoise1.kr(1, 20)).pow(pow); 14 | SelectXFocus.ar( (which+2), sins); 15 | }; 16 | Limiter.ar(in * amp * sines) 17 | }); 18 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/2_process_setups/basicAllProcessSetup.scd: -------------------------------------------------------------------------------- 1 | /////////// EXAMPLE PROCESS SETUP //////////// 2 | 3 | // // post all found processes: 4 | // (q.dir.ntmi +/+ "*processes/*.scd").pathMatch.collect { |path| 5 | // path.basename.splitext[0].asSymbol; 6 | // }.postcs; 7 | 8 | // [ 'rjkChaos', 'allArm', 'bleepo', 'brushes', 'cat', 'dog', 'etude', 'filterFB', 'formSing', 'frya', 'kiteHi', 'moogSing', 'revFB', 'robTron', 'test', 'varsawFB', 'vowel', 'xFMSH', 'xf-bufFun', 'xf-ringMod' ].collect { |key| key -> key }.cs; 9 | 10 | 11 | ( 12 | /// processes: preload all found processes 13 | processNames: [ 'rjkChaos', 'allArm', 'bleepo', 'brushes', 'cat', 'dog', 'etude', 'filterFB', 'formSing', 'frya', 'kiteHi', 'moogSing', 'revFB', 'robTron', 'test', 'varsawFB', 'vowel', 'xFMSH', 'xf-bufFun', 'xf-ringMod' ], 14 | 15 | //// write out the default preset names for each process: 16 | //// replace when people use multiple presets files, 17 | processPresets: [ 18 | // modify like this: 19 | // ('rjkChaos' -> 'rjkChaosMine') 20 | ('rjkChaos' -> 'rjkChaos'), 21 | ('allArm' -> 'allArm'), 22 | ('bleepo' -> 'bleepo'), 23 | ('brushes' -> 'brushes'), 24 | ('cat' -> 'cat'), 25 | ('dog' -> 'dog'), 26 | ('etude' -> 'etude'), 27 | ('filterFB' -> 'filterFB'), 28 | ('formSing' -> 'formSing'), 29 | ('frya' -> 'frya'), 30 | ('kiteHi' -> 'kiteHi'), 31 | ('moogSing' -> 'moogSing'), 32 | ('revFB' -> 'revFB'), 33 | ('robTron' -> 'robTron'), 34 | ('test' -> 'test'), 35 | ('varsawFB' -> 'varsawFB'), 36 | ('vowel' -> 'vowel'), 37 | ('xFMSH' -> 'xFMSH'), 38 | ('xf-bufFun' -> 'xf-bufFun'), 39 | ('xf-ringMod' -> 'xf-ringMod') 40 | ], 41 | 42 | //////// start with isak favorites: 43 | slotsNames: [ 'robTron', 'cat', 'revFB', 'xFMSH'], 44 | //////// or with hannes favorites: 45 | // slotNames: [ 'bleepo', 'moogSing', 'revFB', 'xFMSH'], 46 | ) 47 | 48 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/5_full_setups/allProcesses.scd: -------------------------------------------------------------------------------- 1 | //// this is a sketch only, not working yet!! 2 | 3 | /////////// EXAMPLE PROCESS SETUP //////////// 4 | 5 | // // post all found processes: 6 | // (q.dir.ntmi +/+ "*processes/*.scd").pathMatch.collect { |path| 7 | // path.basename.splitext[0].asSymbol; 8 | // }.postcs; 9 | 10 | 11 | ( 12 | /// processes: preload all found processes 13 | processNames: (q.dir.ntmi +/+ "*processes/*.scd").pathMatch.collect { |path| 14 | path.basename.splitext[0].asSymbol; 15 | }, 16 | //////// start with isak favorites: 17 | slotsNames: [ 'robTron', 'cat', 'revFB', 'xFMSH'], 18 | //////// or with hannes favorites: 19 | // slotNames: [ 'bleepo', 'moogSing', 'revFB', 'xFMSH'], 20 | 21 | // influx weight presets to load or create - usually 8 22 | // string or symbol is filename, number is randseed: 23 | influxPresets: [ 3, 12, 37, 42, 45, 86, 98, 875 ], 24 | // key of influxPreset to put into starting weights: 25 | influxWeights: 42, 26 | 27 | ////// not yet implemented, just sketched here: 28 | influxTerrains: [\none, \tanh, \env7, \env13], 29 | currTerrain: [\tanh], 30 | 31 | // preload these effects files for MainFX 32 | effectsFiles: [ "basic" ], 33 | mfxSlotNames: [ '00_in', '0OnePolBal', '0_DBComp', '0_comp', '0_gate', '0freqBal', '1holz', '1ixiDist', '3AdCVerb', '3ring', '3thrasher', '4ixiVerb', '5HPF', '5LPF', '6roto', '7Delay', '9endFilt', '9monofy', '9stereofy', 'ampFin' ], 34 | 35 | /////////// not implemented yet, just sketched here - 36 | // preload these combinations of MainFX presets: 37 | mfxPresetNames: [ \theology, \cybernetics, \psychoanalysis ], 38 | // and call up this one to start 39 | mfxPreset: \psychoanalysis 40 | ) 41 | 42 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/example_startup_files/NTMI_AbsRel_workshop.scd: -------------------------------------------------------------------------------- 1 | /*** example for NTMI AbsRel workshop setup *** 2 | 3 | // start oscar&xflux 4 | NTMI.oscar.makeServer; 5 | // activate flatcat simulation 6 | defer ({ Tdef(\flatcatSim).stop.play }, 1); 7 | 8 | *****/ 9 | 10 | // load all supported interfaces 11 | NTMI.interfacesToLoad = [ 12 | "nUFO", 13 | "uc4", "mu8", 14 | "nanoKtl", 15 | "dual_analog_3_2", 16 | "dual_analog_4", 17 | "ferrari", 18 | "xtm" 19 | ]; 20 | 21 | 22 | // now run NTMI setup: 23 | NTMI.run; 24 | 25 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/example_startup_files/NTMI_basic_desktop.scd: -------------------------------------------------------------------------------- 1 | 2 | /**** Startup file example for NTMI setup on desktop systems, such as macOS *** 3 | The NTMI quark needs the StartupFile quark, because it uses the LoadMe class. 4 | 5 | You can copy this file to your NTMI/POOL folder, 6 | modify it there to your liking, then write a redirection 7 | file with StartupFile: 8 | 9 | StartupFile.writeStartupFileToExternalPath(\myNTMI, thisProcess.nowExecutingPath); 10 | 11 | StartupFile.dialog; 12 | *****/ 13 | 14 | // prepare and use my own special hello sound 15 | NTMI.helloSound = { 16 | // stereo 17 | { LFDNoise3.ar(XLine.kr(4000!2, 20, 1, doneAction: 2), 0.05) }.play; 18 | }; 19 | 20 | // you can test different other configs on macOS for development 21 | // NTMI.isPi = true; // raspberry - e.g. use smaller gui 22 | 23 | // NTMI.hasGui = false; // test headless 24 | // NTMI.usesMidi = false; // don't look for MIDI devices (faster and more stable) 25 | // NTMI.usesHid = false; // dont look for HID devices (faster and more stable) 26 | 27 | 28 | //////// finally, run NTMI for full setup 29 | NTMI.run; 30 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/example_startup_files/NTMI_flat_krak_auto.scd: -------------------------------------------------------------------------------- 1 | /*** example for NTMI & flatcat setup *** 2 | 3 | // To use with StartupFile, do 4 | StartupFile.writeStartupFileToExternalPath(\flatcat_NTMI, 5 | thisProcess.nowExecutingPath; 6 | ); 7 | // then to choose it, do 8 | StartupFile.dialog; 9 | 10 | // start oscar&xflux 11 | NTMI.oscar.makeServer; 12 | // activate flatcat simulation 13 | defer ({ Tdef(\flatcatSim).stop.play }, 1); 14 | 15 | // stop this tdef from unintended self-looping (happens sometimes) 16 | Tdef(\allLEDs).clear; 17 | 18 | // NetLib quark has this: 19 | NetAddr.myIP 20 | // nUFO NTMI network address is: 21 | "169.254.1.2" 22 | // close nUFO device when switching to flatcat 23 | MKtl(\nUFO).closeDevice; 24 | 25 | *****/ 26 | 27 | // s.options.device = "UMC404HD 192k"; 28 | 29 | NTMI.interfacesToLoad = [ 30 | // "nUFO", 31 | "uc4", "mu8", 32 | // "nanoKtl", 33 | // "dual_ana_32", 34 | // "dual_ana_4", 35 | "ferrari", 36 | "xtm", 37 | "flatcat/", 38 | ]; 39 | 40 | 41 | // Schedule loading the flatcat files 42 | // after the full NTMI setup finishes: 43 | NTMI.finalSetup = { 44 | 45 | NTMI.nUFO.modes = [\full, \touch, \binary, \binMove]; 46 | 47 | "\n\n*** NTMI.finalSetup for AbsRel+kraken+flatcat setup: \n".postln; 48 | 49 | Butz(\NTMI).run(\InfluxMixer); 50 | Window.find(\InfluxMixer).moveTo(500, 700).front; 51 | 52 | // NTMI.tryLoadMKtl("kraken_modal*"); 53 | 54 | Butz(\NTMI).remove(\miniNTMI); 55 | Butz(\NTMI).add(\stopNUFO, { MKtl.all.nUFO.closeDevice; "nUFO is closed.".postln }); 56 | Butz(\NTMI).add(\flatcat, { 57 | defer { 58 | // load flatcat setup/connection file 59 | NTMI.tryLoadMKtl("flatcat/*flatcat*"); 60 | NTMI.g.main.imuUV.drawFunc.add(\flatcat, NTMI.flatcat.drawFunc); 61 | // NTMI.g.main.imuUV.drawFunc.disable(\imuPad); 62 | NTMI.g.main.imuUV.animate_(true); 63 | NTMI.flatcat.zoom = 1.0; 64 | 65 | // Window.find(\flatcat).moveTo(500, 200).front; 66 | } 67 | }); 68 | 69 | 70 | // NTMI.kraken.zoom = 0.5; 71 | // 72 | 73 | // autostart flatcat sim? 74 | // defer ({ Tdef(\flatcatSim).stop.play }, 5); 75 | "*** NTMI.finalSetup DONE.\n\n".postln; 76 | }; 77 | 78 | // now run NTMI setup, then flatcat 79 | NTMI.run; 80 | 81 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/example_startup_files/NTMI_flatcat.scd: -------------------------------------------------------------------------------- 1 | /*** example for NTMI & flatcat setup *** 2 | 3 | // To use with StartupFile, do 4 | StartupFile.writeStartupFileToExternalPath(\flatcat_NTMI, 5 | thisProcess.nowExecutingPath; 6 | ); 7 | // then to choose it, do 8 | StartupFile.dialog; 9 | *****/ 10 | 11 | // Schedule loading the flatcat files 12 | // after the full NTMI setup finishes: 13 | NTMI.finalSetup = { 14 | // load flatcat setup/connection file 15 | LoadMe("SpecialUses/flatcat/flatcat*.scd", NTMI.dir.setup); 16 | // show the flatcat visualisation on the main window 17 | NTMI.g.main.imuUV.drawFunc.add(\flatcat, NTMI.flatcat.drawFunc); 18 | // and turn off showing the imu and pads 19 | NTMI.g.main.imuUV.drawFunc.disable(\imu); 20 | }; 21 | // now run NTMI setup, then flatcat 22 | NTMI.run; 23 | 24 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/POOL/example_startup_files/NTMI_patchbox.scd: -------------------------------------------------------------------------------- 1 | 2 | /**** Startup file example for NTMI setup on raspberry/patchbox systems *** 3 | The NTMI quark needs the StartupFile quark, because it uses the LoadMe class. 4 | 5 | You can copy this file to your ~/NTMI/POOL folder, 6 | modify it there to your liking, then write a redirection 7 | file with StartupFile: 8 | 9 | StartupFile.writeStartupFileToExternalPath(\myNTMI, thisProcess.nowExecutingPath); 10 | 11 | StartupFile.dialog; 12 | *****/ 13 | 14 | "*** NTMI on patchbox ***".postln; 15 | 16 | // prepare and use my own special hello sound 17 | NTMI.helloSound = { 18 | // stereo 19 | { LFDNoise3.ar(XLine.kr(4000!2, 20, 1, doneAction: 2), 0.05) }.play; 20 | }; 21 | 22 | // typical setup for patchbox 23 | NTMI.isPi = true; // raspberry - use smaller gui if desktop 24 | 25 | NTMI.hasGui = false; // set flag for headless 26 | 27 | // skipping some interface types will make loading faster and more stable: 28 | // NTMI.usesMidi = false; // skip MIDI 29 | NTMI.usesHid = false; // skip HID devices 30 | 31 | NTMI.interfacesToLoad = ["mu8"]; 32 | // For further personalization, see here: 33 | /* 34 | Document.open(NTMI.dir.setup +/+ "HOW_TO_PERSONALIZE/1_Configure_setup.scd"); 35 | */ 36 | 37 | // for example, post which MKtls were loaded after setup: 38 | NTMI.finalSetup = { 39 | "MKtls loaded: %\n".postf(MKtl.all); 40 | }; 41 | 42 | //////// finally, run NTMI for full setup 43 | NTMI.run; 44 | 45 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/__README_NTMI_projdir.md: -------------------------------------------------------------------------------- 1 | # NTMI_AI_sc - A project folder for SuperCollider 2 | 3 | This repository contains the full setup for the Nontrivial Music Instrument (NTMI) by Airborne Instruments. You can code is all in SuperCollider, and can be loaded from the SuperCollider IDE; for better access to users with little interest in coding, it is also packaged in Standalone apps made with SuperCollider. It is hosted at github here: 4 | https://github.com/aiberlin/NTMI 5 | 6 | 7 | Instructions to run this setup with SuperCollider: 8 | 9 | 1. install NTMI as a quark: 10 | ``` 11 | Quarks.install("https://github.com/aiberlin/NTMI"); 12 | ``` 13 | NTMI requires several quarks - in case the loadscript fails, 14 | please make sure you have the latest versions of these quarks: 15 | ``` 16 | [ "JITLibExtensions", "adclib", "Influx", "Modality-toolkit", "Vowel", "PaneView" ].do(Quark(_).update); 17 | ``` 18 | 2. optional: install SC3-plugins (some additional sound patches use the UGens SVF and RLPFD) 19 | 20 | 3. run the file "00loadMe.scd" (or load it from a startup file etc) 21 | 22 | 23 | --- 24 | The project folder is organised as follows: 25 | 26 | __README_NTMI_projdir.md - this textfile 27 | 28 | _Interface_Functions.scd - Overview of all functions that controllers should access to play with the NTMI app. 29 | 30 | ********* the code base: ************ 31 | 32 | - 0_globals/ - self-tests, server & network setup 33 | - 00_loadMe.scd - the sc script that loads the project 34 | - 1_prefs/ - user and default preferences for the app 35 | 36 | - 2_liveInput.scd - support for live sound input 37 | - 2a_preset_func.scd - make presets for the sound 38 | 39 | - 3_interfaces/ - OSC, MIDI devices, the 4 slots, presets, 40 | - 5_postres/ - MainOut Effects, NTMI-osc simulator, etc. 41 | - 8_GUIs/ - all Graphical User Interfaces 42 | 43 | - 9_optionals/ - code files that are NOT loaded automatically 44 | - macos_binaries/ - binaries for macOS commandline programs: 45 | tongsengmod for MTP, OSCGroupClient, etc 46 | 47 | - POOL/ - a pool of all sound and fx processes and settings; users can copy this to their user home dir and modify it as desired (e.g. add sounds and FX) there. 48 | 49 | **************** EXTRAS **************** 50 | 51 | Sketches - sketches and tests for developing next features 52 | 53 | Tests - A test suite for verifying that all is well, plus utilities, e.g. for multichannel speakers 54 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/forwarding/forwarding_NTMI.scd: -------------------------------------------------------------------------------- 1 | /*** forward all messages to NTMI setup, 2 | so a second system gets the same messages. 3 | only forward the relative ones to avoid jumps? 4 | ***/ 5 | 6 | // examples: 7 | NTMI.slots.playAt(0) 8 | -> [\NTMI, \slots, \playAt, 0] 9 | 10 | NTMI.printInterface("NTMI.", 0); 11 | 12 | MFdef(\mainPre) 13 | 14 | [ mainPre, mainPreStep, mainVol, mainVolGet, mainVolGetUni, mainVolSetUni, mainVolStep, ndefVolStep, setRelInf ] 15 | 16 | NTMI.incZoom.value(inc: ); // Function 17 | NTMI.setZoom.value(val: ); // Function 18 | 19 | NTMI.bin // Event 20 | NTMI.flatcat // Event 21 | NTMI.inph // Event 22 | NTMI.keypl // Event 23 | NTMI.mfx // Event 24 | NTMI.mkmix // Event 25 | NTMI.nUFO // Event 26 | NTMI.nanoKtl // Event 27 | NTMI.ndef // Event 28 | NTMI.pre // Event 29 | NTMI.process // Event 30 | NTMI.ro // Event 31 | NTMI.slots // Event 32 | NTMI.wse // Event 33 | 34 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/forwarding/forwarding_influx.scd: -------------------------------------------------------------------------------- 1 | // Send send influx values to an external process. 2 | 3 | q.forwardAddr = NetAddr.localAddr.port_(4711); 4 | 5 | NTMI.inphlux.action.add(\forward, { 6 | // get all outVals in order 7 | var outVals = NTMI.inphlux.outNames.collect { |name| 8 | NTMI.inphlux.outValDict[name] 9 | }; 10 | // // uncomment this line to debug 11 | // outVals.postln; 12 | q.forwardAddr.sendMsg(\influxOuts, *outVals); 13 | }); 14 | 15 | /* 16 | //// test receiving influx forward: 17 | thisProcess.openUDPPort(q.forwardAddr.port); 18 | OSCdef(\testInfluxRecv, { |msg| 19 | msg.round(0.001).postcs; 20 | }, \influxOuts); 21 | */ -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/forwarding/forwarding_nUFO.scd: -------------------------------------------------------------------------------- 1 | /**** 2 | The NTMI environment can be used to influence external processes, 3 | such as visual patches or VR worlds running on the same network. 4 | This file has some examples for how to forward 5 | messages from the NTMI environment. 6 | 7 | When using the nufo, you may want to forward all nufo 8 | messages to an external address; 9 | Or maybe you may want to forward influx values, 10 | or other things within the NTMI environment. 11 | 12 | For convenient forwarding to networks of SC clients, 13 | see also the HyperDisCo quark: 14 | "https://github.com/aiberlin/HyperDisCo".openOS 15 | 16 | *****/ 17 | 18 | /// E.g. forward all interface messages from the nUFO: 19 | /// get all osc message names coming from nUFO 20 | q.nufoMsgNames = [ '/ntmi/btns', '/ntmi/caps', '/ntmi/enc', '/ntmi/imu' ]; 21 | 22 | // set the address to forward them to 23 | q.forwardAddr = NetAddr("169.254.1.2", 51900); 24 | 25 | // make listeners for all of them that send to the forward address. 26 | "making nufo forward functions:".postln; 27 | q.nufoRelays = q.nufoMsgNames.collect { |msgName| 28 | var name = ("fwd_" ++ msgName.asString.drop(6)).asSymbol.postln; 29 | OSCdef(name, { |msg| 30 | // msg.postln; 31 | q.forwardAddr.sendMsg(*msg); 32 | }, msgName); 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/macos_binaries/tongsengmod: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/macos_binaries/tongsengmod -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/soundfiles/examples/Fiona_N_T_M_I.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/soundfiles/examples/Fiona_N_T_M_I.aif -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/soundfiles/examples/Fiona_nUFO.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/soundfiles/examples/Fiona_nUFO.aif -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/soundfiles/examples/Oliver_N_T_M_I.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/soundfiles/examples/Oliver_N_T_M_I.aif -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/soundfiles/examples/Samantha_Airborne_Instruments.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/soundfiles/examples/Samantha_Airborne_Instruments.aif -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/soundfiles/examples/Serena_Airborne_Instruments.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/soundfiles/examples/Serena_Airborne_Instruments.aif -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/soundfiles/examples/Serena_nUFO.aif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiberlin/NTMI/489d0787651ea2a746654db364bf08e360dd049b/NTMI_AI_sc_setup/soundfiles/examples/Serena_nUFO.aif -------------------------------------------------------------------------------- /NTMI_AI_sc_setup/tests/screenSize_guiTest.scd: -------------------------------------------------------------------------------- 1 | /* 2 | Test main window for multiple screen sizes, e.g.: 3 | Tdef(\guiTest).getHalo(\allExtents) 4 | 5 | remaining problem: 6 | in 4/3 ratio, the pads are very wide 7 | and the mviews not wide enough 8 | 9 | // test all these in a row: 10 | Tdef(\guiTest).set(\winExtent, nil).play; 11 | 12 | // test individual ones 13 | Tdef(\guiTest).set(\winExtent, (1920@1080)).play; 14 | 15 | Tdef(\guiTest).set(\winExtent, (1512@944)).play; 16 | 17 | Tdef(\guiTest).set(\winExtent, (1280@800)).play; 18 | 19 | Tdef(\guiTest).set(\winExtent, (1024@768)).play; 20 | 21 | Tdef(\guiTest).set(\winExtent, (800@480)).play; 22 | 23 | Tdef(\guiTest).set(\winExtent, (640@480)).play; 24 | 25 | Tdef(\guiTest).set(\winExtent, (480@320)).play; 26 | 27 | // see layout in the abstract, no subviews 28 | ( 29 | NTMI.g.main.skipper.stop; 30 | NTMI.g.main.w.view.children.do { |c| c.children.do(_.remove) }; 31 | NTMI.g.main.w.view.children.do(_.background_(Color.rand)); 32 | ) 33 | Butz.curr_(\interfaces).show 34 | */ 35 | 36 | Tdef(\guiTest).addHalo(\allExtents, [ 37 | (1920@1080), (1512@944), (1280@800), (1280@720), 38 | (1024@768), (800@480), (640@480), (480@320) 39 | ]); 40 | 41 | Tdef(\guiTest).addHalo(\allExtents, [ 42 | (1920@1080), (1512@944), (1280@800), (1280@720), 43 | (1024@768), (800@480), (640@480), (480@320) 44 | ]); 45 | 46 | Tdef(\guiTest).getHalo(\allExtents).do { |ext| 47 | (ext.x / ext.y).asFraction(5).postln; 48 | }; 49 | 50 | 51 | Tdef(\guiTest).addHalo(\makeGui, { 52 | Tdef(\guiTest).gui(2).parent.moveTo(0,0).alwaysOnTop_(true) 53 | }); 54 | 55 | Tdef(\guiTest, { |env| 56 | 57 | (env.winExtent ? Tdef(\guiTest).getHalo(\allExtents)).do { |winExtent| 58 | var winName = "Main_NTMI at: %x%".format(*winExtent.asArray).postcs; 59 | Window.closeAll; 60 | Tdef(\guiTest).getHalo.makeGui; 61 | 62 | NTMI.g.clear; 63 | NTMI.g.bounds = winExtent.asRect; 64 | LoadMe("8_GUIs/*scd", NTMI.dir.setup); 65 | // NTMI.g.printInterface("NTMI.g."); 66 | NTMI.g.sortedKeysValuesDo { |k, v| [k,v].postln }; ""; 67 | 68 | Butz.show; 69 | Butz(\NTMI).run(\Main_NTMI); 70 | Window.find(\Main_NTMI).name_(winName); 71 | 3.wait; 72 | }; 73 | "Tdef(\\guiTest) done.".postln; 74 | }).clock_(AppClock); 75 | -------------------------------------------------------------------------------- /Platforms/Raspberry/90-hidraw-permissions.rules: -------------------------------------------------------------------------------- 1 | KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev" -------------------------------------------------------------------------------- /Platforms/Raspberry/HIDperm_raspi.txt: -------------------------------------------------------------------------------- 1 | Permissions 2 | 3 | 4 | You will have to set the permissions with udev to be correct, create a file in the folder: /etc/udev/rules.d/, and name it (e.g.) 90-hidraw-permissions.rules 5 | 6 | In the file, you will need this line: 7 | 8 | KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev" 9 | 10 | This will give read and write permissions to hidraw-devices to users that are in the plugdev group on your system. 11 | 12 | To check whether you belong to that group execute the command groups in the terminal. 13 | 14 | After you have added the udev rules file, you can access the device after plugging and replugging the device. 15 | 16 | You can change the permission manually (as root) from the terminal with the command: 17 | sudo chmod 664 /dev/hidraw* 18 | sudo chgrp plugdev /dev/hidraw* 19 | Check the permissions with: 20 | "ls /dev/hidraw* -lah".unixCmd; -------------------------------------------------------------------------------- /Platforms/Raspberry/HowToSetupOnRaspi.txt: -------------------------------------------------------------------------------- 1 | // Setting up a Raspi for NTMI 2 | 3 | 1. with Raspberry Pi Imager, make an SD with 4 | current patchbox image, 5 | and desired hostname, known networks etc 6 | 7 | // In Terminal - get midi to work: 8 | systemctl stop amidiauto 9 | systemctl disable amidiauto 10 | // In Terminal - enable hid for gamepads: 11 | sudo chmod 664 /dev/hidraw* 12 | sudo chgrp plugdev /dev/hidraw* 13 | 14 | // In Terminal - use patchbox for jack settings: 15 | patchbox 16 | // go to jack settings, 17 | select audio device (USB, CODEC or similar) 18 | set samplerate to 44100 19 | set hardware buffer size to 256 20 | set number of buffers to 3 21 | 22 | 23 | 2. Start SuperCollider 24 | 25 | 3. install NTMI quark. 26 | This installs all other needed quarks. 27 | Quarks.install("NTMI"); 28 | 29 | 4. check which are there now: 30 | Quarks.installed.collect(_.name); 31 | // update if needed 32 | Quarks.installed.do(_.update); 33 | // if you have local modifications to quark folders, 34 | // delete them and reinstall them fresh, 35 | // or do git restore on the changed files 36 | 37 | // recompile ... then 38 | StartupFile.openDir 39 | // copy a file, rename it to "ntmi.scd", 40 | // put this line in the file and save it 41 | NTMI.run; 42 | 43 | // should be true: 44 | StartupFile.pathsDict.keys.includes('ntmi'); 45 | // write startup.scd that points to ntmi startup file: 46 | StartupFile.writeRedirectFile('ntmi') 47 | 48 | /// reboot interpreter .... 49 | /// if the server boots and you get a big GUI window that says NTMI: 50 | // DONE! // -------------------------------------------------------------------------------- /Work/Lab/influxCombteeth.scd: -------------------------------------------------------------------------------- 1 | 2 | q.addCombTeeth = { |dict, ndef, influx| 3 | var controlKeys = ndef.controlKeys; 4 | var influxKeysDict = (); 5 | 6 | ndef.addHalo(\keysAll, controlKeys); 7 | ndef.addHalo(\influxKeysDict.postcs, influxKeysDict); 8 | controlKeys.do { |ckey, i| 9 | influxKeysDict.put(*[ckey, influx.outNames[i]].postcs); 10 | }; 11 | 12 | ndef.addHalo(\keysOff, [\amp]); 13 | ndef.addHalo(\keysScram, controlKeys.scramble); 14 | ndef.addHalo(\keysPercent, 1.0); 15 | 16 | ndef.addHalo(\keysToGet, { |dict| 17 | var keysScram, numKeys; 18 | keysScram = dict[\keysScram]; 19 | keysScram.removeAll(dict[\keysOff]); 20 | numKeys = (dict[\keysPercent].clip(0, 1) * keysScram.size).round(1).asInteger; 21 | keysScram.keep(numKeys) 22 | }); 23 | 24 | ndef.addHalo(\setFromInfluxTeeth, { |dict| 25 | var keysVals = dict.keysToGet.collect { |ckey, i| 26 | var infoutkey = dict[\influxKeysDict][ckey]; 27 | var inflval = influx.outValDict[infoutkey]; 28 | if (inflval.isNil) { 29 | [ckey, infoutkey, inflval].postcs; 30 | nil 31 | } { 32 | [ckey, inflval.biuni]; 33 | }; 34 | }.flat; 35 | 36 | ndef.setUni(*keysVals); 37 | }); 38 | }; 39 | 40 | q.addCombTeeth(Ndef(\robTron), q.inphlux); 41 | 42 | Ndef(\robTron).controlKeys.size; 43 | q.inphlux.outNames.size 44 | q.inphlux.outValDict.size 45 | q.inphlux.outNames.collect { |name| q.inphlux.outValDict[name] }; 46 | 47 | 48 | 49 | Ndef(\robTron).addHalo(\keysPercent, 0.33); 50 | Ndef(\robTron).getHalo.keysToGet; 51 | Ndef(\robTron).controlKeys.difference(Ndef(\robTron).getHalo.influxKeysDict.keys); 52 | Ndef(\robTron).getHalo.setFromInfluxTeeth; 53 | 54 | Ndef(\robTron).getHalo.influxKeysDict.size; 55 | 56 | Ndef(\robTron).addHalo(\keysPercent, 0.51); 57 | Ndef(\robTron).getHalo.keysToGet; 58 | 59 | Ndef(\robTron).addHalo(\keysPercent, -123); 60 | Ndef(\robTron).getHalo.keysToGet; 61 | 62 | -------------------------------------------------------------------------------- /Work/Lab/ledCollective.scd: -------------------------------------------------------------------------------- 1 | 2 | c = MKtlElementCollective(MKtl(\ntmi), \ledBk, ( 3 | elements: (1..8).collect { |num, i| 4 | var name = num.asSymbol; 5 | (type: \pad, ioType: \out) 6 | }; 7 | )); 8 | 9 | MKtl(\ntmi).device.source.sendMsg("/ntmi/ledCtl/back", 0, 1, 1, 1); -------------------------------------------------------------------------------- /Work/Optionals/Ferrari_instructions.txt: -------------------------------------------------------------------------------- 1 | ******** FERRARI Gamepad patch for Liz Allbee ********* 2 | 3 | INSTRUCTIONS: 4 | 5 | --- START: 6 | - Attach Ferrari Gamepad 7 | - start HAI_xosc app 8 | -> loads everything automatically, 9 | ends with big red gui window, 10 | with a scope, 4 big sliders, etc ... 11 | ----> and opens this text file ... 12 | 13 | --- PLAYING: 14 | == on GUI: 15 | - select 4 front sounds in the 4 big GUI slots 16 | - default is rjkChaos, kiteHi, moogSing, xFMSH 17 | 18 | == on Ferrari: 19 | 20 | - SELECT sounds to activate: Buttons 1 2 3 4 dis/enable four front sounds 21 | 22 | - PLAY / Silence : Hold Button 6 - right shoulder - to play, let go for silence 23 | 24 | --- CONTROL/INFLUENCE sound params by joysticks: 25 | + right joystick up/down is always amp, 26 | + left joystick (and right js left/right) are either: 27 | - first 3 parameters of each active sound (direct control), 28 | + meta controls that influance all parameters 3 thru an influx object 29 | 30 | - CHOOSE control mode: press button 5 for 31 | -> direct mode -> sliders are light gray 32 | -> influx mode -> sliders are green 33 | -------------------------------------------------------------------------------- /Work/Optionals/measureFrameRate.scd: -------------------------------------------------------------------------------- 1 | 2 | /// measure incoming imu speed: 3 | /*** sketch: 4 | q.accelcount = 0; 5 | q.times = List[]; 6 | q.times.size; 7 | 8 | MFdef(\ntmiImuFunc).add(\counter, { 9 | var el = MKtl(\ntmi).elAt(\accel, \x); 10 | q.times.add (el.lastUpdateTime); 11 | if (q.accelcount >= 1000) { 12 | "done".postln; 13 | MFdef(\ntmiImuFunc).remove(\counter); 14 | }; 15 | q.accelcount = q.accelcount + 1;Pw 16 | }); 17 | ***/ 18 | 19 | /////// not working yet:PP 20 | /// measure incoming imu speed: 21 | q.speedTest = q.speedTest ? (); 22 | q.speedTest.imuRun = { |dict, time = 10| 23 | q.speedTest.imuCount = 0; 24 | q.speedTest.imuTimes = List[]; 25 | q.speedTest.imuElem = MKtl(\ntmi).elAt(\accel, \x); 26 | MFdef(\ntmiImuFunc).add(\counter, { 27 | q.speedTest.imuTimes (q.speedTest.imuElem.lastUpdateTime); 28 | }); 29 | defer ({ 30 | MFdef(\ntmiImuFunc).remove(\counter); 31 | "q.speedTest imu done: % imu msgs in % secs.".postf(q.speedTest.imuTimes, time); 32 | "see also q.speedTest.imuTimes;".postln 33 | }, 10); 34 | }; 35 | 36 | 37 | q.speedTest.imuRun; -------------------------------------------------------------------------------- /Work/Optionals/warnWin.scd: -------------------------------------------------------------------------------- 1 | 2 | q.warnWin = { |q, string="?!?", title="?!?"| 3 | var w = Window("Warning: %".format(title)).front.alwaysOnTop_(true); 4 | var tv = StaticText(w, w.view.bounds); 5 | tv.background_(Color(1, 0.75)); 6 | tv.align_(\center); 7 | w.alpha_(0.9); 8 | tv.string_(string).font_(Font(Font.defaultMonoFace, 24)); 9 | }; 10 | 11 | -------------------------------------------------------------------------------- /Work/Sketches/LayoutTestsAgain.scd: -------------------------------------------------------------------------------- 1 | w = Window().front; 2 | w.layout = VLayout( 3 | HLayout( 4 | MultiSliderView().elasticMode_(1) 5 | .minSize_(Size(120, 200)).maxSize_(Size(180, 300)).indexIsHorizontal_(false).value_({ 1.0.rand } ! 17), 6 | UserView().minSize_(Size(200, 200)).maxSize_(Size(300, 300)) 7 | .background_(Color.red) 8 | ), 9 | HLayout( 10 | StaticText().minSize_(Size(120, 120)).maxSize_(Size(180, 300)), 11 | MultiSliderView(w).minSize_(Size(200, 120)).maxSize_(Size(300, 300)) 12 | .elasticMode_(1).value_({ 1.0.rand } ! 18) 13 | ) 14 | ); -------------------------------------------------------------------------------- /Work/Sketches/MFdef_Gui.scd: -------------------------------------------------------------------------------- 1 | MFdef(\mainWinUpdate).activeNames; 2 | 3 | MFdef(\mainWinUpdate).enable(\imuPad); 4 | 5 | ( 6 | ~mfgui = { |mf| 7 | var w = Window(mf.cs, Rect(100, 100, 300, 200)).front; 8 | var modebuts, funcbuts; 9 | var updateFuncbuts = { 10 | funcbuts.do { |but, i| 11 | but.value = mf.activeNames.postln.includes(but.states[0][0].asSymbol) 12 | }; 13 | }; 14 | w.view.layout = HLayout( 15 | VLayout( 16 | StaticText(w).string_("modes"), 17 | *modebuts = mf.modes.keys(Array).sort.collect { |modeName| 18 | Button(w).states_([[ modeName ], [modeName, Color.white, Color.red]]) 19 | .action_({ |bt| 20 | mf.mode = modeName; 21 | mf.activeNames.postcs; 22 | updateFuncbuts.value; 23 | }) 24 | } 25 | ), 26 | VLayout( 27 | StaticText(w).string_("funcs"), 28 | *funcbuts = mf.orderedNames.collect {|funcName| 29 | Button(w).states_([[ funcName ], [funcName, Color.white, Color.red]]) 30 | .action_({ |bt| 31 | if (bt.value > 0) { 32 | mf.enable(funcName) 33 | } { 34 | mf.disable(funcName) 35 | }; 36 | mf.activeNames.postcs; 37 | }) 38 | } 39 | ) 40 | ); 41 | updateFuncbuts.value; 42 | }; 43 | ~mfgui.value(MFdef(\mainWinUpdate)); 44 | ) -------------------------------------------------------------------------------- /Work/Sketches/checkForRaspiScreen.scd: -------------------------------------------------------------------------------- 1 | // check for raspi screen 2 | 3 | Window.allWindows.do { |w| 4 | var bnds = w.bounds; 5 | if (bnds.width > 790) { 6 | ("too wide:" + w.name + bnds.width).postln; 7 | bnds.width = min(bnds.width, 790); 8 | }; 9 | if (bnds.height > 440) { 10 | ("too high:" + w.name + bnds.height).postln; 11 | bnds.height = min(bnds.height, 440); 12 | }; 13 | bnds.left = 0; 14 | bnds.top = 0; 15 | w.bounds = bnds; 16 | }; 17 | 18 | OK: wsetta 19 | OK: ndefMixer 20 | OK: presets 21 | OK: uc4 22 | OK: nUFO 23 | OK: mainFX 24 | OK: slotSounds 25 | too wide: nanoKtl 912.0 26 | 27 | -------------------------------------------------------------------------------- /Work/Sketches/dev_tests/__rangeTests_xosc.scd: -------------------------------------------------------------------------------- 1 | // raw tests for xosc imu ranges 2 | 3 | MKtl(\xosc).elAt(\accel)[0].deviceSpec; 4 | MKtl(\xosc).elAt(\gyro)[0].deviceSpec; 5 | MKtl(\xosc).elAt(\magnet)[0].deviceSpec; 6 | MKtl(\xosc).elAt(\imu9).valueAction = 0.5!9 7 | MKtl(\xosc).collectivesDict[\imu].value = 0.5!10 8 | MKtl(\xosc).collectivesDict[\imu].valueAction = 0.6!10 9 | MKtl(\xosc).collectivesDict[\imu]; 10 | 11 | 12 | MKtl(\xosc).collectivesDict[\imu].value = 0; MFdef(\imuFunc).value; 13 | MKtl(\xosc).collectivesDict[\imu].value = 0.2; MFdef(\imuFunc).value; 14 | MKtl(\xosc).collectivesDict[\imu].value = 0.5; MFdef(\imuFunc).value; 15 | MKtl(\xosc).collectivesDict[\imu].value = 0.7; MFdef(\imuFunc).value; 16 | MKtl(\xosc).collectivesDict[\imu].value = 1.0; MFdef(\imuFunc).value; 17 | 18 | // test the raw message values: 19 | n = NetAddr.localAddr; 20 | // close to 1.0 21 | n.sendMsg(\imu, 130, 130, 130, 1.65, 1.65, 1.65, 0.82, 0.82, 0.82); 22 | n.sendMsg(\imu, 130, 130, 130, 1.65, 1.65, 1.65, 0.82, 0.82, 0.82); 23 | // 0 centered: 24 | n.sendMsg(\imu, *0.0!10); 25 | // ca. 0.5 26 | n.sendMsg(\imu, 65, 65, 65, 0.8, 0.8, 0.8, 0.4, 0.4, 0.4, 3.5); 27 | 28 | q.inphlux.outOffsets; 29 | q.inphlux.dump; 30 | -------------------------------------------------------------------------------- /Work/Sketches/dev_tests/maingui_loadtests.scd: -------------------------------------------------------------------------------- 1 | w = Window("test", Window.availableBounds).front; 2 | u = UserView(w, Rect(100, 100, 450, 550)).front; 3 | 4 | q.inph.mode = \full; 5 | 6 | x.stop; 7 | x = SkipJack({ u.refresh }, 0.04); 8 | x.dump 9 | 10 | u.drawFunc = { |uv| 11 | var bounds = uv.bounds.moveTo(0,0); 12 | var center = bounds.center; 13 | var centPadsL, padsLPos, centPadsR, padsRPos; 14 | var star; 15 | 16 | if ([\full, \touch].includes(q.inph.mode)) { 17 | centPadsL = center.copy.x_(center.x - (center.y * 1.8)); 18 | centPadsR = center.copy.x_(center.x + (center.y * 1.8)); 19 | padsLPos = [ -0.6, -0.2, 0.2, 0.6].collect { |angle| 20 | Polar(center.y * 1.5, angle * 0.8).asPoint + centPadsL; 21 | }; 22 | 23 | padsRPos = [ 0.6, 0.2, -0.2, -0.6].collect { |angle| 24 | Polar(center.y * -1.5 + pi, angle * 0.8).asPoint + centPadsR; 25 | }; 26 | 27 | // 4 left, 4 right touchpads 28 | (padsLPos ++ padsRPos).collect { |pt, i| 29 | Pen.addArc(pt, 60, 0, 2pi); 30 | Pen.color_(g.main.padCols[i]); 31 | Pen.fill; 32 | // Pen.stringCenteredIn(i.asString, Rect.aboutPoint(pt, 60, 60), 33 | // font: Font(Font.defaultMonoFace, 96), 34 | // color: Color.black); 35 | }; 36 | }; 37 | 38 | // visualize move mode as star of 9; 39 | if ([\full, \move].includes(q.inph.mode)) { 40 | // "move mode vis".postln; 41 | star = g.main.movevals.collect { |val, i| 42 | Polar(val.linlin( 0, 1, 40, 240), i / 9 * 2pi).asPoint + center; 43 | }; 44 | // star.postln; 45 | Pen.color = Color.yellow; Pen.width = 3; 46 | star.wrapExtend(10).doAdjacentPairs { |p1, p2| Pen.line(p1, p2); }; 47 | Pen.stroke; 48 | star.do { |p1| Pen.line(p1, center); }; 49 | Pen.color = Color.white; Pen.width = 1.5; 50 | Pen.stroke; 51 | }; 52 | 53 | }; 54 | -------------------------------------------------------------------------------- /Work/Sketches/dev_tests/xosc_minmaxes.scd: -------------------------------------------------------------------------------- 1 | [ '/imu', -1.9512195587158, 2.3170733451843, 0.24390244483948, -0.63916015625, -0.1494140625, 0.7666015625, 0.3282051384449, 0.0051282052882016, -0.26410257816315, 45.379413604736 ] 2 | 3 | OSCdef.all(_.disable); 4 | OSCdef.trace(false); 5 | 6 | q.osc = q.osc ? (); 7 | q.osc.imuMax = 0!10; 8 | q.osc.imuMin = 0!10; 9 | 10 | thisProcess.openUDPPort(8000); 11 | 12 | OSCdef(\imuMax, { |msg| 13 | msg.drop(1).do { |val, i| 14 | if(q.osc.imuMax[i] < val) { 15 | q.osc.imuMax[i] = val; 16 | q.osc.imuMax.round(0.0001).postln; 17 | }; 18 | if(q.osc.imuMin[i] > val) { 19 | q.osc.imuMin[i] = val; 20 | q.osc.imuMin.round(0.0001).postln; 21 | }; 22 | }; 23 | }, '/imu').enable; 24 | 25 | /////// max/mins with wild shaking: 26 | q.osc.imuMax.max(q.osc.imuMin.abs); 27 | [ -990.12194824219, -1172.2561035156, -770.18292236328, -8.05615234375, -5.896484375, -6.95458984375, -0.553846180439, -0.82564103603363, -0.5, 0 ] 28 | 29 | q.osc.imuMin; 30 | 31 | [ 1417.4391, 1460.3658, 761.5854, 6.4185, 3.0757, 9.8003, 0.4256, 0.2128, 0.4795, 59.0265 ].size 32 | 33 | -------------------------------------------------------------------------------- /Work/Sketches/storage_folder_format.txt: -------------------------------------------------------------------------------- 1 | processes/ 2 | allArm.scd // sound + default specs 3 | allArm_presets/ 4 | allArm.specs.scd /// personalized specs/ranges 5 | allArm_adc.specs.scd 6 | 7 | allArm.pxpreset.scd // default preset file 8 | allArm_funky.pxpreset.scd // personalized preset files ... 9 | allArm_bongo.pxpreset.scd 10 | cat.scd 11 | cat_presets/ 12 | ... 13 | mainfx/ 14 | 00_in.scd // ProxyChain.add3( ... ); 15 | 0OnePolBal.scd 16 | 0_DBComp.scd 17 | 0_comp.scd 18 | 0_gate.scd 19 | 0freqBal.scd 20 | 1holz.scd 21 | 1ixiDist.scd 22 | 3AdCVerb.scd 23 | 3ring.scd 24 | 3thrasher.scd 25 | 4ixiVerb.scd 26 | 5HPF.scd 27 | 5LPF.scd 28 | 6roto.scd 29 | 7Delay.scd 30 | 9endFilt.scd 31 | 9monofy.scd 32 | 9stereofy.scd 33 | ampFin.scd 34 | ntmi.mfx.scd // MainFX(s, slotNames, ...); 35 | theology.mfxpreset.scd 36 | cybernetics.mfxpreset.scd 37 | 38 | influx/ 39 | diagL.infpreset.scd 40 | diagR.infpreset.scd 41 | 23.infpreset.scd 42 | 666.infpreset.scd 43 | -------------------------------------------------------------------------------- /Work/Sketches/timeMktl.scd: -------------------------------------------------------------------------------- 1 | /// measuring lastUpdateTime from MKtls, 2 | /// to display which interfaces were recently active 3 | ~time = (); 4 | ~time.actives = [ MKtl(\ntmi), MKtl(\uc4), MKtl(\ferrari) ]; 5 | ~time.times = (); 6 | ~time.spec = [1000, 1, \exp].asSpec; 7 | ~time.actives.do { |mk| ~time.times.addSpec(mk.name, ~time.spec) }; 8 | 9 | ~time.egui = EnvirGui(~time.times); 10 | 11 | ~time.times.getSpec 12 | 13 | ~time.skip.stop.free; 14 | ~time.skip = SkipJack({ 15 | ~time.actives.do { |mk| 16 | ~time.times.put(mk.name, mk.timeSinceLast) 17 | } 18 | }); 19 | ~time.skip.dt = 0.5; 20 | 21 | MKtl(\ntmi).elAt(\battery).action.cs; 22 | 23 | l = List.new(1024); 24 | MKtl(\ntmi).elAt(\battery).action = { |el| 25 | var val = el.deviceValue; 26 | // l.add(val); 27 | // val.postln; 28 | // if (val > 0) { val.postln }; 29 | }; 30 | 31 | l.postcs; -------------------------------------------------------------------------------- /Work/Sketches/weights_asBWGrid2.scd: -------------------------------------------------------------------------------- 1 | ( 2 | w = Window("Influx").front; 3 | w.layout = VLayout( 4 | HLayout( 5 | ~utext = UserView().background_(Color.rand), 6 | ~uouts = UserView().background_(Color.rand), 7 | ), 8 | HLayout( 9 | ~uins = UserView().background_(Color.rand), 10 | ~uwg = UserView().background_(Color.rand), 11 | ) 12 | ); 13 | 14 | ( 15 | ~utext .drawFunc = { |uv| 16 | var bounds = uv.bounds.moveTo(0,0); 17 | Pen.stringCenteredIn("2d Slider \ninterface here?", bounds); 18 | }; 19 | /// right bottom: outvals 20 | ~uouts.drawFunc = { |uv| 21 | var bounds = uv.bounds.moveTo(0,0); 22 | var width = bounds.width, height = bounds.height; 23 | 24 | var influx = q.inphlux; 25 | var outNames = influx.outNames; 26 | var numCols = outNames.size; 27 | var font = Font(Font.defaultMonoFace, width / numCols * 1.5); 28 | 29 | var colstep = bounds.width / numCols; 30 | var lineCol = Color.green(1, 0.8); 31 | var nameCol = Color.green(0.9, 0.8); 32 | 33 | // outvals as colors 34 | influx.outNames.do { |name, i| 35 | var rect = Rect(0 + (i * colstep), 0, colstep, height); 36 | Pen.addRect(rect); 37 | Pen.color = Color.grey(1 - influx.outValDict[name].biuni); 38 | Pen.fill; 39 | Pen.stringCenteredIn(name.asString, rect, font, nameCol); 40 | }; 41 | /// right bottom: outvals as line 42 | 43 | influx.outNames.do { |name, i| 44 | var x = colstep * (i + 0.5); 45 | var y = influx.outValDict[name].biuni * height; 46 | if (i == 0) { Pen.moveTo(x@y) } { Pen.lineTo(x@y) }; 47 | }; 48 | Pen.color_(lineCol).width_(3).stroke; 49 | 50 | Pen.stringCenteredIn("OUTVALS", bounds.copy.top_(width * 0.25), font, Color.white); 51 | }; 52 | ); 53 | 54 | ~uins.drawFunc = { |uv| 55 | var bounds = uv.bounds.moveTo(0,0); 56 | Pen.stringCenteredIn("inputs here", uv.bounds.extent.asRect) 57 | }; 58 | ~uwg.drawFunc = { |uv| 59 | var bounds = uv.bounds.moveTo(0,0); 60 | Pen.stringCenteredIn("weights here", uv.bounds.extent.asRect) 61 | }; 62 | ); -------------------------------------------------------------------------------- /Work/Sketches/weights_tests.scd: -------------------------------------------------------------------------------- 1 | q.inphlux.resetInvals; 2 | 3 | fork { 4 | var infx = q.inphlux; 5 | var names = q.inphlux.getHalo.imuNames; 6 | ~allOuts = (0.. 511).collect { |allCombos| 7 | var bits = allCombos.asInteger.asBinaryDigits(9); 8 | infx.set(*[names, bits.unibi].flop.flat); 9 | 0.1.wait; 10 | infx.outValDict.asArray; 11 | }; 12 | "done".postln; 13 | }; 14 | 15 | ~testa = ~allOuts.flop.collect(_.sort)[0]; 16 | ~testa.plot; 17 | ~testa.tanh.plot; 18 | 19 | q.inphlux.inScaler 20 | 21 | ~testa 22 | ~testa.bilin(0, -4, 4, 1, -4, 4, nil).plot; 23 | 24 | [-4, -3, -2, -1, 0, 1, 2, 3, 4].bilin(0, -4, 4, 1, -4, 4, nil); 25 | 26 | -------------------------------------------------------------------------------- /Work/Tests/test_channels.scd: -------------------------------------------------------------------------------- 1 | Tdef(\pink).set(\dt, 0.25); 2 | Tdef(\pink).set(\chans, (0..5)); 3 | 4 | Tdef(\pink, { |ev| 5 | Ndef(\pink, { PinkNoise.ar(0.1) }); 6 | loop { 7 | ev.chans.do { |i| 8 | Ndef(\pink).play(i.postln); 9 | ev.dt.wait; 10 | }; 11 | } 12 | }).play; 13 | 14 | 15 | Ndef(\pink).gui; 16 | -------------------------------------------------------------------------------- /Work/unused/5_analogToInflux.scd: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////// 2 | /////////////////////////////////////////////////////////////// 3 | //// ANALOG INS Touchmod 4 | /////////////////////////////////////////////////////////////// 5 | /////////////////////////////////////////////////////////////// 6 | 7 | ( 8 | q.inphlux.addHalo(\padNames, q.inphlux.inNames.copyRange(9, 16)); 9 | 10 | MFdef(\touchToInph).add(\set, { 11 | var influx = q.inphlux; 12 | var pads = MKtl(\xosc).elAt(\pads8); 13 | var padInNames = q.inphlux.getHalo(\padNames); 14 | var keysValues = pads.collect { |pad, i| 15 | [ padInNames[i], pad.value] 16 | }.flat; 17 | q.inphlux.set(*keysValues); 18 | }); 19 | 20 | ////// this is the action that gets triggered 21 | ////// when values come in from the xosc - 22 | ////// use this to compensate for crosstalk, 23 | ////// and sending the final values once. 24 | 25 | MKtl(\xosc).collAt('aIn').groupAction = nil; 26 | 27 | MKtl(\xosc).collAt('aIn').groupAction = { |coll| 28 | var values = coll.value; 29 | var xtalkFactor = 0.5; 30 | 31 | // // MAGIC crosstalk compensation - adc Mar 2019 - seems an improvement 32 | // // value[1] = value[1].linlin(value[0] * 0.5, 1, 0, 1); 33 | (15..1).do { |i| 34 | values[i] = values[i].linlin(values[i - 1] * xtalkFactor, 1, 0, 1); 35 | }; 36 | 37 | q.osc.rawPads = values[8..]; 38 | 39 | // q.zero.pads is the rest state of the pads 40 | // use it to stretch to a range of 0-1 41 | (8..15).do { |i| 42 | var rawval = values[i]; 43 | var zeroOffset = q.zero.pads.asArray.wrapAt(i); 44 | var stretched = rawval.linlin(zeroOffset, 0.9, 0, 1); 45 | values.put(i,stretched); 46 | }; 47 | 48 | // set to the compensated values, no action 49 | MKtl(\xosc).elAt('inA').value_(values); 50 | // trigger touch to inphlux only once ... 51 | MFdef(\touchToInph).value; 52 | // and explicitly trigger zoom action 53 | MKtl(\xosc).elAt('inA', 7).doAction; 54 | 55 | }; 56 | 57 | // individual pad action - useful for guis 58 | /// do global set only once, from MFdef(\touchToInph) 59 | MKtl(\xosc).elAt(\pads8).do { |pad, i| 60 | pad.action.add(\setInflux, {|ana| 61 | var name = q.inphlux.getHalo(\padNames).clipAt(i); 62 | q.inphlux.set(name, ana.value.pow(3)); 63 | //.pow(6)); 64 | // the pow(6) helps toflatten the steep curve of the FSRs as they are now. 65 | ana.value 66 | }) 67 | }; 68 | 69 | ); 70 | 71 | -------------------------------------------------------------------------------- /Work/unused/ndef-menu-choice.scd: -------------------------------------------------------------------------------- 1 | // ToDo: re-write all popup lists REMOVING the 3 other selected items.having same Ndef on 2 slots makes no sense. 2 | // q.allSoundNames shd be Symbols, cavolo! 3 | /* 4 | q.ndefs; 5 | a = q.allSoundNames; // this shd be Symbols, cavolo! 6 | a.removing( q.ndefs[0].key.asString ) 7 | a.[0].class; 8 | 9 | a = (0..10); 10 | a = a.removing(6) 11 | 12 | ##### 13 | i = 1; // aktueller slotIndex 14 | j = q.ndefs.copy; 15 | j.removeAt(i); 16 | j; // die jezt rausfiltern aus der akt. choice 17 | 18 | a = q.allSoundNames; 19 | j.do{|ndef, ii| 20 | q.allSoundNames = q.allSoundNames.removing( ndef.key ) 21 | }; 22 | ##### 23 | */ 24 | 25 | q.choiceNewNdefFunc = {|env, slotIndex, choiceIndex, key| 26 | Routine{ 27 | // var a = q.allSoundNames[slotIndex]; 28 | var path = q.allSoundPaths.detect{|path| path.contains(key) }; 29 | var choiceNdef = Ndef(key.asSymbol); 30 | var choiceOldNdef = q.ndefs[slotIndex]; 31 | 32 | path.load; 33 | 0.2.wait; // hmmm.. asynch .. how to know ? 34 | 35 | q.ndefs = q.ndefs.put(slotIndex, choiceNdef); 36 | q.ndefs[slotIndex].set(\amp, 0).play(vol: 0.25); 37 | 38 | //////////// GUIGUIGUI ///////// 39 | q.ndefs.do { |ndef, i| // in 0_inphlux - needed? 40 | q.inphGui.attachToButton(i, ndef); 41 | }; 42 | q.ndefGuis.do { |g, i| g.object = q.ndefs[i] }; 43 | //////////// GUIGUIGUI ///////// 44 | 45 | // q.maPresetWin.getHalo(\butRow) 46 | // q.maPresetWin == q.ndefPresetGlobalWin ; 47 | 48 | // breaks if multiple slots have same Ndef selected ! 49 | if( q.ndefs.includes( choiceOldNdef ).not ){ 50 | 0.1.wait; 51 | choiceOldNdef.end(2); 52 | 2.wait; 53 | choiceOldNdef.clear; 54 | }; 55 | 56 | // if no other Error, store 57 | File.use(q.choiseNdefs_storePath, "w", { |file| file.write(q.ndefs.collect(_.key).cs) } ); 58 | 59 | 60 | }.play(AppClock); 61 | [ slotIndex, choiceIndex, key].postcln; 62 | 63 | }; 64 | 65 | Window.allWindows.do({|c|c.name.postcln}) -------------------------------------------------------------------------------- /Work/xosc_backup/5_analogToInflux.scd: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////// 2 | /////////////////////////////////////////////////////////////// 3 | //// ANALOG INS Touchmod 4 | /////////////////////////////////////////////////////////////// 5 | /////////////////////////////////////////////////////////////// 6 | 7 | //neu - remove weird crosstalk from each input to next 8 | ( 9 | q.inphlux.addHalo(\padNames, q.inphlux.inNames.copyRange(9, 16)); 10 | 11 | MFdef(\touchToInph).add(\set, { 12 | var influx = q.inphlux; 13 | var pads = MKtl(\xosc).elAt(\pads8); 14 | var padInNames = q.inphlux.getHalo(\padNames); 15 | var keysValues = pads.collect { |pad, i| 16 | [ padInNames[i], pad.value] 17 | }.flat; 18 | q.inphlux.set(*keysValues); 19 | }); 20 | 21 | OSCdef(\xana, { |msg| 22 | var values = msg.drop(1); 23 | var influxKeysVals; 24 | var xtalkFactor = 0.5; 25 | // andere sensor vieleicht passt andere nummer 26 | // value[1] = value[1].linlin(value[0] * 0.5, 1, 0, 1); 27 | // MAGIC crosstalk compensation of 28 | //////// adc Mar 2019 - still seems an improvement 29 | (15..1).do { |i| 30 | values[i] = values[i].linlin(values[i - 1] * xtalkFactor, 1, 0, 1); 31 | }; 32 | 33 | q.osc.rawPads = values[8..]; 34 | 35 | // q.zero.pads is the rest state of the pads 36 | // use it to stretch to a range of 0-1 37 | (8..15).do { |i| 38 | var rawval = values[i]; 39 | var zeroOffset = q.zero.pads.asArray.wrapAt(i); 40 | var stretched = rawval.linlin(zeroOffset, 0.9, 0, 1); 41 | values.put(i,stretched); 42 | }; 43 | 44 | MKtl(\xosc).elAt('inA').value_(values); 45 | MFdef(\touchToInph).value; 46 | 47 | MKtl(\xosc).elAt('inA', 7).doAction; 48 | 49 | }, '/inputs/analogue').permanent_(true); 50 | ); 51 | 52 | // individual pad action - useful for guis 53 | /// do global set only once, from MFdef(\touchToInph) 54 | MKtl(\xosc).elAt(\pads8).do { |pad, i| 55 | pad.action.add(\setInflux, {|ana| 56 | var name = q.inphlux.getHalo(\padNames).clipAt(i); 57 | q.inphlux.set(name, ana.value.pow(3)); 58 | //.pow(6)); 59 | // the pow(6) helps toflatten the steep curve of the FSRs as they are now. 60 | ana.value 61 | }) 62 | }; 63 | 64 | 65 | /* 66 | 67 | MFdef(\xoscFunc).add(\setInphlux, { 68 | var values = MKtl(\xosc).elAt(\accel).value.unibi ++ MKtl(\xosc).elAt(\gyro).value.unibi ++ MKtl(\xosc).elAt(\magnet).value.unibi ; 69 | var names = q.inphlux.inNames; 70 | var keysvals = [names, values * q.inph.scale].flop.flat; 71 | q.inphlux.set(*keysvals); 72 | }); 73 | 74 | q.ndefs.do { |ndef, i| 75 | MKtl(\xosc).elAt(\inA, [8,9,10,11][i]).action.add(\setNdef, { |ana| 76 | ndef.vol_( (ana.value - 0.0).cubed.clip(0, 1)) 77 | }); 78 | }; 79 | 80 | [8,9,10,11].do{|i| MKtl(\xosc).elAt(\inA, i).action.disable(\setNdef) }; 81 | [8,9,10,11].do{|i| MKtl(\xosc).elAt(\inA, i).action.enable(\setNdef) }; 82 | */ 83 | -------------------------------------------------------------------------------- /Work/xosc_backup/6_influxZOOM_in_out.scd: -------------------------------------------------------------------------------- 1 | // q.zoom sets all the influx'es inScalers AND RandomOrbit's excursion from current state. 2 | 3 | q.zoom = q.zoom?1; 4 | 5 | q.setZoom = {|ev, val| 6 | val = val.clip(0.05, 1.0).round(0.05); 7 | // "global ZOOM f. RandomOrbits and Influxes: %\n".postf(val); 8 | q.zoom = val; 9 | // do external funcs here 10 | try{ q.prez.ezs.value = q.zoom }; 11 | q.inphlux.inScaler = q.zoom; 12 | // return value 13 | val 14 | }; 15 | // increment / decrement 16 | q.incZoom = {|ev, inc=0.1| 17 | q.setZoom((q.zoom + inc)); 18 | }; 19 | 20 | 21 | // set it to poti on ana in 8 (it was 7, not worked) 22 | MKtl(\xosc).elAt('inA').at(7).action.add(\setZoom, {|el| 23 | var val = el.value.clip(0.05, 1).round(0.05); 24 | if (val != q.zoom) { 25 | "zoom from xosc: %\n".postf(val); 26 | q.setZoom(val) 27 | }; 28 | }); 29 | 30 | -------------------------------------------------------------------------------- /Work/xosc_backup/xoscSim.scd: -------------------------------------------------------------------------------- 1 | q.addrSC = NetAddr.localAddr; 2 | 3 | OSCdef.trace(false); 4 | // turn off the internal ones for now; 5 | // MKtl(\xosc).device.oscFuncDictionary.do(_.disable); 6 | 7 | // run just the external ones: 8 | OSCdef(\imu).enable; 9 | 10 | /* TEST IMU 11 | // - very different ranges on these, accels very low - why? 12 | q.addrSC.sendMsg(\imu, * ({ 1.0.rand } ! 9 ++ 100.rand)); 13 | */ 14 | 15 | OSCdef(\imuAlive).enable; 16 | /* 17 | OSCdef.trace(true, true); 18 | q.addrSC.sendMsg(\imuAlive, ); 19 | */ 20 | 21 | /* test buttons from remote: 22 | q.addrSC.sendMsg('/inputs/digital', 0, 2.rand); 23 | q.addrSC.sendMsg('/inputs/digital', 1, 2.rand); 24 | q.addrSC.sendMsg('/inputs/digital', 2, 2.rand); 25 | q.addrSC.sendMsg('/inputs/digital', 3, 2.rand); 26 | */ 27 | 28 | OSCdef(\xana).enable; 29 | /* 30 | // has weird crosstalk compensation and bending curve on values 31 | q.addrSC.sendMsg('/inputs/analogue', *(0!16)); 32 | q.addrSC.sendMsg('/inputs/analogue', *(0.5!16)); 33 | q.addrSC.sendMsg('/inputs/analogue', *({0.75.rand}!16)); 34 | */ 35 | 36 | Tdef(\xoscSimulator).set(\dt, 0.2); 37 | 38 | Tdef(\xoscSimulator, { |ev| 39 | var imuvals = 0 ! 9; 40 | var anavals = 0 ! 16; 41 | var tempval = 20; 42 | 43 | inf.do { |i| 44 | // send OSC messages for analog and imu at typical rates, 45 | // random drift unless played otherwise by some sim interface. 46 | 47 | imuvals = imuvals.collectInPlace { |val| (val + 0.2.rand2 * 0.95).fold2(8.0).round(0.01) }; 48 | tempval = (tempval + 3.rand2).fold(0, 100); 49 | 50 | anavals = anavals.collectInPlace { |val, i| (val + 0.05.rand2 * 0.95).fold(0, 1).round(0.01) }; 51 | 52 | // zoom - pretend pot rand jitter to be filtered 53 | anavals.put(7, q.zoom); 54 | 55 | q.addrSC.sendMsg(\imu, *(imuvals ++ tempval)); 56 | q.addrSC.sendMsg('/inputs/analogue', *anavals); 57 | 58 | ev.dt.wait; 59 | 60 | } 61 | }); 62 | 63 | //////// start simulation from xosc GUI: 64 | MKtl(\xosc).elAt(\inD, \15).action = { |bt| 65 | if (bt.value > 0) { 66 | "*** starting sim: ".post; 67 | Tdef(\xoscSimulator).postln.play; 68 | } 69 | }; 70 | MKtl(\xosc).elAt(\inD, \16).action = { |bt| 71 | if (bt.value > 0) { 72 | "*** stopping sim: ".post; 73 | Tdef(\xoscSimulator).stop; 74 | } 75 | }; -------------------------------------------------------------------------------- /Work/xosc_backup/xosc_ballet.scd: -------------------------------------------------------------------------------- 1 | ////////////// xosc nufo is unused by now /////////// 2 | // OSCdef(\xoscAlive, { |msg, time| 3 | // if (NTMI.nufo.lastInTime == 0 or: { NTMI.nufo.timeSinceLast > 10 }) { 4 | // Tdef(\allLEDs).play; 5 | // }; 6 | // NTMI.nufo.deviceName = \xosc; 7 | // NTMI.nufo.lastInTime = time; 8 | // }, "/imu").permanent_(true); 9 | --------------------------------------------------------------------------------