diff --git a/release-packaging/Examples/TheButton/forces-button.scd b/release-packaging/Examples/TheButton/forces-button.scd new file mode 100644 index 0000000000000000000000000000000000000000..15f3ed8325286f7b9ebc80754e126f154a142c61 --- /dev/null +++ b/release-packaging/Examples/TheButton/forces-button.scd @@ -0,0 +1,65 @@ + +/* + +The Button: +Stepping through forces with the device button. + +The axes of the Omega device are ordered as follows: + +(0) x: back-front +(1) y: left-right +(2) z: down-upward + +all values are bipolar +the center is zero + +*/ + +// omega +( + +s.options.blockSize = 32; +//s.options.blockSize = 16; // not good, dropouts +s.options.hardwareBufferSize = s.options.blockSize; +s.options.numWireBufs = 1024; +s.reboot; +); + + +( +var folder = "forces/".resolveRelative; +var load = { |which| + var p, paths = (folder +/+ "*.scd").pathMatch; + if(paths.isEmpty) { + "no files found in folder '%'".format(folder).warn + } { + which = which % paths.size; + p = paths.at(which); + "\n\nSwitching to '%' (number %)\n%\n".format(p.basename, which, p).postln; + load(paths.at(which)) + } +}; + +~ld = load; + +Ndef(\the_button, { + f = { |deviceIndex| + var btn = OmegaButton.kr(deviceIndex); + var step = Stepper.kr(btn); + SendTrig.kr(Changed.kr(step), value: step); + }; + 2.do(f); +}); + +// register to receive button changes +OSCdef(\omegaButtonResponder, { arg msg, time; + var path, sth, sth_else, currentForce; + # path, sth, sth_else, currentForce = msg; + + load(currentForce); + +},'/tr', s.addr); + +load.(0); +) + diff --git a/release-packaging/Examples/TheButton/forces/01-inertia copy.scd b/release-packaging/Examples/TheButton/forces/01-inertia copy.scd new file mode 100644 index 0000000000000000000000000000000000000000..38277c8d9b35925c1aa22beb74fba67ad1d05046 --- /dev/null +++ b/release-packaging/Examples/TheButton/forces/01-inertia copy.scd @@ -0,0 +1,33 @@ +/* + +Inertia + + +*/ + + + +( +Ndef(\x, { + var devices = 2; + var f; + var dragFactor = 0.3; + var mass = 0.4; + f = { |deviceIndex| + var z, v, accel, drag, inertia, surface, force; + z = OmegaPosition.kr(2, deviceIndex); + v = OmegaVelocity.kr([0,1,2], deviceIndex); + + accel = Slope.kr(Smooth.kr(v, 400, 2, 64)); + //accel = Slope.kr(v); + drag = v.neg * dragFactor; + inertia = accel.neg * mass; + + force = inertia + drag; + + OmegaForceOut.kr([0, 1, 2], force, deviceIndex); + }; + devices.do.(f) + +}) +); \ No newline at end of file diff --git a/release-packaging/Examples/TheButton/forces/02-surface.scd b/release-packaging/Examples/TheButton/forces/02-surface.scd new file mode 100644 index 0000000000000000000000000000000000000000..e498a307ffae7a379a1dbced9f819f9b1ade1b9c --- /dev/null +++ b/release-packaging/Examples/TheButton/forces/02-surface.scd @@ -0,0 +1,24 @@ +/* + +Stiff surface + + +*/ + + + +( +Ndef(\x, { + var devices = 2; + var strength = 16; + var stiffness = 300; + var f; + f = { |deviceIndex| + var z = OmegaPosition.kr(2, deviceIndex); + var force = (z < 0) * (z.neg * stiffness); + OmegaForceOut.kr(2, force, deviceIndex); + }; + devices.do.(f) + +}) +); \ No newline at end of file diff --git a/release-packaging/Examples/TheButton/forces/03-spaceship-clutch.scd b/release-packaging/Examples/TheButton/forces/03-spaceship-clutch.scd new file mode 100644 index 0000000000000000000000000000000000000000..77ebab32c10c0a31d64f08cbe0396eb794c2a5d7 --- /dev/null +++ b/release-packaging/Examples/TheButton/forces/03-spaceship-clutch.scd @@ -0,0 +1,33 @@ +/* + +Spaceship clutch + +This needs Zwirn (https://lab.al0.de/julian/nth) + +*/ + + + +( +Ndef(\x, { + var devices = 2; + + var f, d, zwirn, force, forceSum; + d = [0, 1, 2]; + + zwirn = [[1, 0, 1, 0], 2, [1, [0, [0, 1, 0, -1, 1, (0..4)], 1, 2, 0]]]; + //zwirn = [(0..50)/10]; + + zwirn = zwirn ++ zwirn.neg; + zwirn = zwirn * 6; + + f = { |deviceIndex| + var pos = OmegaPosition.kr(d, deviceIndex); + var drag = zwirn.zwirnAt(pos * 20); + var clutch = OmegaDrag.kr(d, drag, deviceIndex); + OmegaForceOut.kr(d, clutch, deviceIndex); + }; + devices.do.(f) + +}) +); \ No newline at end of file diff --git a/release-packaging/Examples/TheButton/forces/04-drag-field-near-each-other.scd b/release-packaging/Examples/TheButton/forces/04-drag-field-near-each-other.scd new file mode 100644 index 0000000000000000000000000000000000000000..144c24697502842b44ee2c44e2c849726bbf535d --- /dev/null +++ b/release-packaging/Examples/TheButton/forces/04-drag-field-near-each-other.scd @@ -0,0 +1,24 @@ +/* + +Drag field near each other + +NOTE: this needs exactly __two__ devices + +*/ + + + +( +Ndef(\x, { + var stiffness = 2300; + var d = [0,1,2]; + var a, b, force, dist; + a = OmegaPosition.kr(d, 0); + b = OmegaPosition.kr(d, 1); + dist = (b - a).squared.sum.sqrt; + + force = OmegaDrag.kr(d, dist.linexp(0, 0.2, 200, 0.001), 0); // get drag force from one device plus distance + OmegaForceOut.kr(d, force, 0); + OmegaForceOut.kr(d, force, 1); +}) +); \ No newline at end of file