From 196ddba35a1cdd0339dbdf7b987b814356e86ed5 Mon Sep 17 00:00:00 2001 From: matsem Date: Sun, 13 Oct 2019 21:33:55 +0200 Subject: [PATCH 1/9] Refactor Galaxy sketch Rename StarfieldSketch -> GalaxySketch Rename package Add more MIDI-controllable properties --- src/main/kotlin/dev/matsem/astral/Config.kt | 2 +- .../dev/matsem/astral/di/koin_modules.kt | 4 +- .../matsem/astral/sketches/SketchLoader.kt | 6 +-- .../{starfield => galaxy}/GalaxyImage.kt | 2 +- .../GalaxySketch.kt} | 52 ++++++++++++------- 5 files changed, 41 insertions(+), 25 deletions(-) rename src/main/kotlin/dev/matsem/astral/sketches/{starfield => galaxy}/GalaxyImage.kt (70%) rename src/main/kotlin/dev/matsem/astral/sketches/{starfield/StarfieldSketch.kt => galaxy/GalaxySketch.kt} (83%) diff --git a/src/main/kotlin/dev/matsem/astral/Config.kt b/src/main/kotlin/dev/matsem/astral/Config.kt index 853d9f6d..d07c3283 100644 --- a/src/main/kotlin/dev/matsem/astral/Config.kt +++ b/src/main/kotlin/dev/matsem/astral/Config.kt @@ -3,7 +3,7 @@ package dev.matsem.astral object Config { object Sketch { - const val DEFAULT_SELECTOR = '1' + const val DEFAULT_SELECTOR = 's' } object Color { diff --git a/src/main/kotlin/dev/matsem/astral/di/koin_modules.kt b/src/main/kotlin/dev/matsem/astral/di/koin_modules.kt index df6d0f9a..3500afe8 100644 --- a/src/main/kotlin/dev/matsem/astral/di/koin_modules.kt +++ b/src/main/kotlin/dev/matsem/astral/di/koin_modules.kt @@ -14,7 +14,7 @@ import dev.matsem.astral.sketches.gameoflife.GameOfLifeSketch import dev.matsem.astral.sketches.patterns.PatternsSketch import dev.matsem.astral.sketches.polygonal.PolygonalSketch import dev.matsem.astral.sketches.spikes.SpikesSketch -import dev.matsem.astral.sketches.starfield.StarfieldSketch +import dev.matsem.astral.sketches.galaxy.GalaxySketch import dev.matsem.astral.sketches.starglitch.StarGlitchSketch import dev.matsem.astral.sketches.terrain.TerrainSketch import dev.matsem.astral.sketches.video.VideoSketch @@ -83,6 +83,6 @@ val appModule = module { factory { SpikesSketch() } factory { CubesSketch() } factory { VideoSketch() } - factory { StarfieldSketch() } + factory { GalaxySketch() } factory { GameOfLifeSketch() } } \ No newline at end of file diff --git a/src/main/kotlin/dev/matsem/astral/sketches/SketchLoader.kt b/src/main/kotlin/dev/matsem/astral/sketches/SketchLoader.kt index 567aac57..c7fa957e 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/SketchLoader.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/SketchLoader.kt @@ -15,7 +15,7 @@ import dev.matsem.astral.sketches.gameoflife.GameOfLifeSketch import dev.matsem.astral.sketches.patterns.PatternsSketch import dev.matsem.astral.sketches.polygonal.PolygonalSketch import dev.matsem.astral.sketches.spikes.SpikesSketch -import dev.matsem.astral.sketches.starfield.StarfieldSketch +import dev.matsem.astral.sketches.galaxy.GalaxySketch import dev.matsem.astral.sketches.starglitch.StarGlitchSketch import dev.matsem.astral.sketches.terrain.TerrainSketch import dev.matsem.astral.sketches.video.VideoSketch @@ -88,7 +88,7 @@ class SketchLoader : PApplet(), KoinComponent { private val spikesSketch: SpikesSketch by inject() private val cubesSketch: CubesSketch by inject() private val videoSketch: VideoSketch by inject() - private val starfieldSketch: StarfieldSketch by inject() + private val galaxySketch: GalaxySketch by inject() private val gameOfLifeSketch: GameOfLifeSketch by inject() // endregion @@ -149,7 +149,7 @@ class SketchLoader : PApplet(), KoinComponent { put('9', spikesSketch) put('p', cubesSketch) put('m', videoSketch) - put('s', starfieldSketch) + put('s', galaxySketch) put('g', gameOfLifeSketch) } diff --git a/src/main/kotlin/dev/matsem/astral/sketches/starfield/GalaxyImage.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxyImage.kt similarity index 70% rename from src/main/kotlin/dev/matsem/astral/sketches/starfield/GalaxyImage.kt rename to src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxyImage.kt index 5fd3908a..6aa113ae 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/starfield/GalaxyImage.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxyImage.kt @@ -1,4 +1,4 @@ -package dev.matsem.astral.sketches.starfield +package dev.matsem.astral.sketches.galaxy data class GalaxyImage( val path: String, diff --git a/src/main/kotlin/dev/matsem/astral/sketches/starfield/StarfieldSketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt similarity index 83% rename from src/main/kotlin/dev/matsem/astral/sketches/starfield/StarfieldSketch.kt rename to src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index f11fc563..5b343e9b 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/starfield/StarfieldSketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -1,4 +1,4 @@ -package dev.matsem.astral.sketches.starfield +package dev.matsem.astral.sketches.galaxy import dev.matsem.astral.sketches.BaseSketch import dev.matsem.astral.sketches.SketchLoader @@ -13,12 +13,13 @@ import dev.matsem.astral.tools.kontrol.onTriggerPad import dev.matsem.astral.tools.logging.SketchLogger import org.koin.core.KoinComponent import org.koin.core.inject +import processing.core.PApplet.sin import processing.core.PConstants import processing.core.PImage import processing.core.PVector -import kotlin.math.sin -class StarfieldSketch : BaseSketch(), KoinComponent { +// TODO fg bg color +class GalaxySketch : BaseSketch(), KoinComponent { override val sketch: SketchLoader by inject() @@ -50,10 +51,17 @@ class StarfieldSketch : BaseSketch(), KoinComponent { ) private var bassGain: Float = 0f - private var expandingQuantized: Boolean = false - private var expandingOnBeat: Boolean = false - private var expandingValue = 1f + + private var zoomQuantized: Boolean = false + private var zoomOnBeat: Boolean = false + private var zoomValue = 1f + private var zoomMin = 1f + private var zoomMax = 3f + private var zoomHz = 1 / 60f + private var zoomQuant = 0.005f + private var randomDiameters: Boolean = false + private var diameterFactor = 1f override fun onBecameActive() { kontrol.reset() @@ -71,11 +79,11 @@ class StarfieldSketch : BaseSketch(), KoinComponent { } kontrol.onTogglePad(0, 2, 0) { - expandingQuantized = it + zoomQuantized = it } kontrol.onTogglePad(1, 2, 10) { - expandingOnBeat = it + zoomOnBeat = it } kontrol.onTogglePad(0, 3, 70) { @@ -106,8 +114,8 @@ class StarfieldSketch : BaseSketch(), KoinComponent { } beatCounter.addListener(OnKick, 4) { - if (expandingOnBeat) { - expandingValue = random(1f, 1.5f) + if (zoomOnBeat) { + zoomValue = random(zoomMin, zoomMax) } } } @@ -155,6 +163,11 @@ class StarfieldSketch : BaseSketch(), KoinComponent { override fun draw() = with(sketch) { bassGain = kontrol.slider1.midiRange(1f) + zoomMin = kontrol.knob1.midiRange(1f, 4f) + zoomMax = kontrol.knob2.midiRange(2f, 4f) + zoomHz = kontrol.slider3.midiRange(1 / 60f, 1 / 5f) + zoomQuant = kontrol.knob3.midiRange(0.5f, 0.005f) + diameterFactor = kontrol.knob4.midiRange(0.5f, 1.5f) beatCounter.update() background(30) @@ -162,25 +175,26 @@ class StarfieldSketch : BaseSketch(), KoinComponent { noFill() stroke(0f, 0f, 100f) + if (zoomQuantized) { + zoomValue = sin(angularTimeHz(zoomHz)).mapSin(zoomMin, zoomMax).quantize(zoomQuant) + } + // Galaxy synchronized(lock) { galaxy.forEach { pushMatrix() translateCenter() + scale(zoomValue) it.rotationExtra += audioProcessor.getRange(1000f..4000f).remap(0f, 100f, 0f, 0.02f) * it.randomFactor rotateX(-0.34f) rotateY((millis() - it.birth) * it.ySpeed + it.rotationExtra) rotateZ((millis() - it.birth) * it.zSpeed) - strokeWeight(it.diameter) + strokeWeight(it.diameter * diameterFactor) val amp = audioProcessor.getRange(20f..200f) * random(-0.1f, 0.1f) * bassGain - if (expandingQuantized) { - expandingValue = sin(saw(1 / 5f)).mapp(1f, 1.5f).quantize(0.05f) - } - - val v = it.vec.copy().mult(expandingValue) + val v = it.vec point(v.x, v.y + amp, v.z) popMatrix() } @@ -192,16 +206,17 @@ class StarfieldSketch : BaseSketch(), KoinComponent { .take(audioProcessor .getRange(20f..60f) .remap(0f, 400f, starField.size.toFloat(), starField.size.toFloat() / 2f).toInt() - .constrain(high = starField.size - 1) + .constrain(low = 0, high = starField.size - 1) ) .forEach { pushMatrix() translateCenter() + scale(zoomValue) it.rotationExtra += audioProcessor.getRange(2500f..16000f).remap(0f, 100f, 0f, 0.2f) * it.randomFactor rotateY(millis() * it.ySpeed + it.rotationExtra) rotateZ(millis() * it.zSpeed) - strokeWeight(it.diameter) + strokeWeight(it.diameter * diameterFactor) point(it.vec.x, it.vec.y, it.vec.z) popMatrix() } @@ -209,6 +224,7 @@ class StarfieldSketch : BaseSketch(), KoinComponent { // Black hole pushMatrix() translateCenter() + scale(zoomValue) noStroke() fill(0) ellipseMode(PConstants.CENTER) From 7f4fbb65538800835be446d91f00adccd29a3342 Mon Sep 17 00:00:00 2001 From: matsem Date: Sun, 13 Oct 2019 21:57:34 +0200 Subject: [PATCH 2/9] Update gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7c6cdb92..66f7aaa3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,7 @@ build/ out/ *.iml -local.properties \ No newline at end of file +local.properties +data/midi +data/movies +data/music \ No newline at end of file From 9a6348d712505a04d8bb8c6fcc808efb96a9760b Mon Sep 17 00:00:00 2001 From: matsem Date: Sun, 13 Oct 2019 22:13:18 +0200 Subject: [PATCH 3/9] Add support for global colors --- .../dev/matsem/astral/sketches/galaxy/GalaxySketch.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 5b343e9b..4ee2a9cd 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -170,10 +170,10 @@ class GalaxySketch : BaseSketch(), KoinComponent { diameterFactor = kontrol.knob4.midiRange(0.5f, 1.5f) beatCounter.update() - background(30) + background(bgColor) noFill() - stroke(0f, 0f, 100f) + stroke(fgColor) if (zoomQuantized) { zoomValue = sin(angularTimeHz(zoomHz)).mapSin(zoomMin, zoomMax).quantize(zoomQuant) @@ -226,7 +226,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { translateCenter() scale(zoomValue) noStroke() - fill(0) + fill(bgColor) ellipseMode(PConstants.CENTER) beginShape() sphere(25f) From 4e475b4ce9cbe961a6508793574f3b82be9e004e Mon Sep 17 00:00:00 2001 From: matsem Date: Sun, 13 Oct 2019 22:37:11 +0200 Subject: [PATCH 4/9] Remove resolved TODO --- .../kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 4ee2a9cd..7150e860 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -18,7 +18,6 @@ import processing.core.PConstants import processing.core.PImage import processing.core.PVector -// TODO fg bg color class GalaxySketch : BaseSketch(), KoinComponent { override val sketch: SketchLoader by inject() @@ -164,7 +163,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { override fun draw() = with(sketch) { bassGain = kontrol.slider1.midiRange(1f) zoomMin = kontrol.knob1.midiRange(1f, 4f) - zoomMax = kontrol.knob2.midiRange(2f, 4f) + zoomMax = kontrol.knob2.midiRange(1f, 4f) zoomHz = kontrol.slider3.midiRange(1 / 60f, 1 / 5f) zoomQuant = kontrol.knob3.midiRange(0.5f, 0.005f) diameterFactor = kontrol.knob4.midiRange(0.5f, 1.5f) From 82fe76b2cb4404e5352112dc8a1955dc381de2ff Mon Sep 17 00:00:00 2001 From: matsem Date: Sun, 13 Oct 2019 22:41:59 +0200 Subject: [PATCH 5/9] Rename val, inject galaxy controller --- .../astral/sketches/galaxy/GalaxySketch.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 7150e860..889ee907 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -7,6 +7,7 @@ import dev.matsem.astral.tools.audio.beatcounter.BeatCounter import dev.matsem.astral.tools.audio.beatcounter.OnKick import dev.matsem.astral.tools.audio.beatcounter.OnSnare import dev.matsem.astral.tools.extensions.* +import dev.matsem.astral.tools.galaxy.Galaxy import dev.matsem.astral.tools.kontrol.KontrolF1 import dev.matsem.astral.tools.kontrol.onTogglePad import dev.matsem.astral.tools.kontrol.onTriggerPad @@ -18,10 +19,9 @@ import processing.core.PConstants import processing.core.PImage import processing.core.PVector +// TODO automator class GalaxySketch : BaseSketch(), KoinComponent { - override val sketch: SketchLoader by inject() - data class Star( val vec: PVector, var diameter: Float, @@ -37,13 +37,15 @@ class GalaxySketch : BaseSketch(), KoinComponent { .withFps() .build() + override val sketch: SketchLoader by inject() private val audioProcessor: AudioProcessor by inject() private val beatCounter: BeatCounter by inject() private val kontrol: KontrolF1 by inject() + private val galaxy: Galaxy by inject() private val lock = Any() private val starField = mutableListOf() - private val galaxy = mutableListOf() + private val galaxyStars = mutableListOf() private val images = arrayOf( GalaxyImage(path = "images/galaxy1.png", pixelStep = 3, threshold = 60f), GalaxyImage(path = "images/galaxy2.png", pixelStep = 2, threshold = 50f) @@ -121,7 +123,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { private fun createGalaxy(image: GalaxyImage) = with(sketch) { synchronized(lock) { - galaxy.clear() + galaxyStars.clear() val galaxyImage: PImage = loadImage(image.path).apply { val ratio = pixelWidth / pixelHeight.toFloat() resize(720, (720 / ratio).toInt()) @@ -133,7 +135,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { for (y in 0 until galaxyImage.height step image.pixelStep) { pixelBrightness = brightness(galaxyImage[x, y]) if (pixelBrightness > image.threshold) { - galaxy += Star( + galaxyStars += Star( vec = PVector( x.toFloat() - galaxyImage.width / 2f, random(-4f, 4f), @@ -151,7 +153,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { } private fun randomizeDiameters() = synchronized(lock) { - galaxy.forEach { + galaxyStars.forEach { it.diameter = generateDiameter() } } @@ -180,7 +182,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { // Galaxy synchronized(lock) { - galaxy.forEach { + galaxyStars.forEach { pushMatrix() translateCenter() scale(zoomValue) From f086c7373fbd4cd6d123a20e88a60887ab7aa983 Mon Sep 17 00:00:00 2001 From: matsem Date: Sun, 13 Oct 2019 23:22:35 +0200 Subject: [PATCH 6/9] Add TouchOSC controller, bind controller to sketch --- .../astral/sketches/galaxy/GalaxySketch.kt | 74 +++++++----------- .../dev/matsem/astral/tools/galaxy/Galaxy.kt | 3 + .../tools/galaxy/controls/PushButtonGroup.kt | 22 ++++++ touchosc/Astral.touchosc | Bin 7057 -> 7610 bytes 4 files changed, 52 insertions(+), 47 deletions(-) create mode 100644 src/main/kotlin/dev/matsem/astral/tools/galaxy/controls/PushButtonGroup.kt diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 889ee907..2ce4862b 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -9,8 +9,6 @@ import dev.matsem.astral.tools.audio.beatcounter.OnSnare import dev.matsem.astral.tools.extensions.* import dev.matsem.astral.tools.galaxy.Galaxy import dev.matsem.astral.tools.kontrol.KontrolF1 -import dev.matsem.astral.tools.kontrol.onTogglePad -import dev.matsem.astral.tools.kontrol.onTriggerPad import dev.matsem.astral.tools.logging.SketchLogger import org.koin.core.KoinComponent import org.koin.core.inject @@ -19,7 +17,7 @@ import processing.core.PConstants import processing.core.PImage import processing.core.PVector -// TODO automator +// TODO automator, bass gain slider class GalaxySketch : BaseSketch(), KoinComponent { data class Star( @@ -48,49 +46,33 @@ class GalaxySketch : BaseSketch(), KoinComponent { private val galaxyStars = mutableListOf() private val images = arrayOf( GalaxyImage(path = "images/galaxy1.png", pixelStep = 3, threshold = 60f), - GalaxyImage(path = "images/galaxy2.png", pixelStep = 2, threshold = 50f) + GalaxyImage(path = "images/galaxy2.png", pixelStep = 2, threshold = 50f), + GalaxyImage(path = "images/galaxy1.png", pixelStep = 3, threshold = 50f), + GalaxyImage(path = "images/galaxy2.png", pixelStep = 2, threshold = 40f) ) private var bassGain: Float = 0f - private var zoomQuantized: Boolean = false - private var zoomOnBeat: Boolean = false - private var zoomValue = 1f - private var zoomMin = 1f - private var zoomMax = 3f - private var zoomHz = 1 / 60f - private var zoomQuant = 0.005f - - private var randomDiameters: Boolean = false - private var diameterFactor = 1f + // region remote control - override fun onBecameActive() { - kontrol.reset() - - kontrol.onTriggerPad(0, 0, 50) { - if (it) { - createGalaxy(images[0]) - } - } + private val galaxyImageButtons = galaxy.createPushButtonGroup(10, listOf(4, 5, 6, 7)) { + createGalaxy(images[it]) + } - kontrol.onTriggerPad(0, 1, 50) { - if (it) { - createGalaxy(images[1]) - } - } + private val zoomQuantizeButton = galaxy.createToggleButton(channel = 10, cc = 8, defaultValue = false) + private val zoomOnBeatButton = galaxy.createToggleButton(channel = 10, cc = 9, defaultValue = false) + private val zoomQuantSlider = galaxy.createPot(channel = 10, cc = 10, min = 0.005f, max = 0.5f, initialValue = 0.5f) + private val zoomHzSlider = galaxy.createPot(channel = 10, cc = 11, min = 1 / 60f, max = 1 / 5f, initialValue = 1 / 60f) + private val zoomMinSlider = galaxy.createPot(channel = 10, cc = 12, min = 1f, max = 4f, initialValue = 1f) + private val zoomMaxSlider = galaxy.createPot(channel = 10, cc = 13, min = 1f, max = 4f, initialValue = 2f) + private var zoomValue = 1f - kontrol.onTogglePad(0, 2, 0) { - zoomQuantized = it - } + private val randomDiametersButton = galaxy.createToggleButton(channel = 10, cc = 14, defaultValue = false) + private val starDiameterSlider = galaxy.createPot(channel = 10, cc = 15, min = 0.5f, max = 1.5f, initialValue = 1f) - kontrol.onTogglePad(1, 2, 10) { - zoomOnBeat = it - } + // endregion - kontrol.onTogglePad(0, 3, 70) { - randomDiameters = it - } - } + override fun onBecameActive() = Unit override fun setup() = with(sketch) { // Create galaxy from image @@ -109,14 +91,14 @@ class GalaxySketch : BaseSketch(), KoinComponent { } beatCounter.addListener(OnSnare, 1) { - if (randomDiameters) { + if (randomDiametersButton.isPressed) { randomizeDiameters() } } beatCounter.addListener(OnKick, 4) { - if (zoomOnBeat) { - zoomValue = random(zoomMin, zoomMax) + if (zoomOnBeatButton.isPressed) { + zoomValue = random(zoomMinSlider.value, zoomMaxSlider.value) } } } @@ -164,11 +146,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { override fun draw() = with(sketch) { bassGain = kontrol.slider1.midiRange(1f) - zoomMin = kontrol.knob1.midiRange(1f, 4f) - zoomMax = kontrol.knob2.midiRange(1f, 4f) - zoomHz = kontrol.slider3.midiRange(1 / 60f, 1 / 5f) - zoomQuant = kontrol.knob3.midiRange(0.5f, 0.005f) - diameterFactor = kontrol.knob4.midiRange(0.5f, 1.5f) + val diameterFactor = starDiameterSlider.value beatCounter.update() background(bgColor) @@ -176,8 +154,10 @@ class GalaxySketch : BaseSketch(), KoinComponent { noFill() stroke(fgColor) - if (zoomQuantized) { - zoomValue = sin(angularTimeHz(zoomHz)).mapSin(zoomMin, zoomMax).quantize(zoomQuant) + if (zoomQuantizeButton.isPressed) { + zoomValue = sin(angularTimeHz(zoomHzSlider.value)) + .mapSin(zoomMinSlider.value, zoomMaxSlider.value) + .quantize(zoomQuantSlider.value) } // Galaxy diff --git a/src/main/kotlin/dev/matsem/astral/tools/galaxy/Galaxy.kt b/src/main/kotlin/dev/matsem/astral/tools/galaxy/Galaxy.kt index 24ee7c41..2388745c 100644 --- a/src/main/kotlin/dev/matsem/astral/tools/galaxy/Galaxy.kt +++ b/src/main/kotlin/dev/matsem/astral/tools/galaxy/Galaxy.kt @@ -45,6 +45,9 @@ class Galaxy : MidiDevice { fun createButtonGroup(channel: Int, ccs: List, activeCCs: List) = ButtonGroup(midiBus, channel, ccs, activeCCs).also { controls.add(it) } + fun createPushButtonGroup(channel: Int, ccs: List, listener: (Int) -> Unit) = + PushButtonGroup(midiBus, channel, ccs, listener).also { controls.add(it) } + fun createEncoder(channel: Int, cc: Int, min: Int, max: Int, initialValue: Int = 0) = Encoder(midiBus, channel, cc, min, max, initialValue).also { controls.add(it) } diff --git a/src/main/kotlin/dev/matsem/astral/tools/galaxy/controls/PushButtonGroup.kt b/src/main/kotlin/dev/matsem/astral/tools/galaxy/controls/PushButtonGroup.kt new file mode 100644 index 00000000..4fc9ef9c --- /dev/null +++ b/src/main/kotlin/dev/matsem/astral/tools/galaxy/controls/PushButtonGroup.kt @@ -0,0 +1,22 @@ +package dev.matsem.astral.tools.galaxy.controls + +import themidibus.MidiBus + +class PushButtonGroup( + private val midiBus: MidiBus, + val ch: Int, + val ccs: List, + val listener: (Int) -> Unit +) : GalaxyControl { + + + override fun controllerChange(channel: Int, control: Int, v: Int) { + if (ch == channel && ccs.contains(control) && v == 127) { + listener(ccs.indexOf(control)) + } + } + + override fun update() = Unit + + override fun updatePhone() = Unit +} \ No newline at end of file diff --git a/touchosc/Astral.touchosc b/touchosc/Astral.touchosc index 89c3f2a5c6f983a61e4d4a6fbbe13510f61109c8..00b1ad995db54449f6e315941aaf60730354ff24 100644 GIT binary patch delta 7576 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 delta 7019 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 JL>mAA005KQb|L@( From 006d31330b2c7fec868ca5b20997c03a2cb1fe1b Mon Sep 17 00:00:00 2001 From: matsem Date: Mon, 14 Oct 2019 19:25:27 +0200 Subject: [PATCH 7/9] Add and bind bass gain slider --- .../astral/sketches/galaxy/GalaxySketch.kt | 9 ++++----- touchosc/Astral.touchosc | Bin 7610 -> 7688 bytes 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 2ce4862b..24be6560 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -17,7 +17,7 @@ import processing.core.PConstants import processing.core.PImage import processing.core.PVector -// TODO automator, bass gain slider +// TODO automator class GalaxySketch : BaseSketch(), KoinComponent { data class Star( @@ -51,8 +51,6 @@ class GalaxySketch : BaseSketch(), KoinComponent { GalaxyImage(path = "images/galaxy2.png", pixelStep = 2, threshold = 40f) ) - private var bassGain: Float = 0f - // region remote control private val galaxyImageButtons = galaxy.createPushButtonGroup(10, listOf(4, 5, 6, 7)) { @@ -70,6 +68,8 @@ class GalaxySketch : BaseSketch(), KoinComponent { private val randomDiametersButton = galaxy.createToggleButton(channel = 10, cc = 14, defaultValue = false) private val starDiameterSlider = galaxy.createPot(channel = 10, cc = 15, min = 0.5f, max = 1.5f, initialValue = 1f) + private val bassGainSlider = galaxy.createPot(channel = 10, cc = 16, min = 0f, max = 1f) + // endregion override fun onBecameActive() = Unit @@ -145,7 +145,6 @@ class GalaxySketch : BaseSketch(), KoinComponent { } override fun draw() = with(sketch) { - bassGain = kontrol.slider1.midiRange(1f) val diameterFactor = starDiameterSlider.value beatCounter.update() @@ -173,7 +172,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { rotateZ((millis() - it.birth) * it.zSpeed) strokeWeight(it.diameter * diameterFactor) - val amp = audioProcessor.getRange(20f..200f) * random(-0.1f, 0.1f) * bassGain + val amp = audioProcessor.getRange(20f..200f) * random(-0.1f, 0.1f) * bassGainSlider.value val v = it.vec point(v.x, v.y + amp, v.z) diff --git a/touchosc/Astral.touchosc b/touchosc/Astral.touchosc index 00b1ad995db54449f6e315941aaf60730354ff24..0611358cc9e329dff639c0bb1e2cfe56ab51be76 100644 GIT binary patch delta 6182 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 E05VDBVE_OC delta 6102 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 From 6331f136a73f329f38ae6f755ad1181f07c0c4f4 Mon Sep 17 00:00:00 2001 From: matsem Date: Mon, 14 Oct 2019 19:26:03 +0200 Subject: [PATCH 8/9] Remove kontrol dependency --- .../kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 24be6560..8b34b678 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -38,7 +38,6 @@ class GalaxySketch : BaseSketch(), KoinComponent { override val sketch: SketchLoader by inject() private val audioProcessor: AudioProcessor by inject() private val beatCounter: BeatCounter by inject() - private val kontrol: KontrolF1 by inject() private val galaxy: Galaxy by inject() private val lock = Any() From 71fd57808bbe98a4fa01e0f05fea8e40be3b4902 Mon Sep 17 00:00:00 2001 From: matsem Date: Mon, 14 Oct 2019 19:32:29 +0200 Subject: [PATCH 9/9] Bind midi automator --- .../matsem/astral/sketches/galaxy/GalaxySketch.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt index 8b34b678..3171b229 100644 --- a/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt +++ b/src/main/kotlin/dev/matsem/astral/sketches/galaxy/GalaxySketch.kt @@ -6,9 +6,9 @@ import dev.matsem.astral.tools.audio.AudioProcessor import dev.matsem.astral.tools.audio.beatcounter.BeatCounter import dev.matsem.astral.tools.audio.beatcounter.OnKick import dev.matsem.astral.tools.audio.beatcounter.OnSnare +import dev.matsem.astral.tools.automator.MidiAutomator import dev.matsem.astral.tools.extensions.* import dev.matsem.astral.tools.galaxy.Galaxy -import dev.matsem.astral.tools.kontrol.KontrolF1 import dev.matsem.astral.tools.logging.SketchLogger import org.koin.core.KoinComponent import org.koin.core.inject @@ -17,7 +17,6 @@ import processing.core.PConstants import processing.core.PImage import processing.core.PVector -// TODO automator class GalaxySketch : BaseSketch(), KoinComponent { data class Star( @@ -39,6 +38,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { private val audioProcessor: AudioProcessor by inject() private val beatCounter: BeatCounter by inject() private val galaxy: Galaxy by inject() + private val automator: MidiAutomator by inject() private val lock = Any() private val starField = mutableListOf() @@ -74,6 +74,15 @@ class GalaxySketch : BaseSketch(), KoinComponent { override fun onBecameActive() = Unit override fun setup() = with(sketch) { + automator.setupWithGalaxy( + channel = 10, + recordButtonCC = 0, + playButtonCC = 1, + loopButtonCC = 2, + clearButtonCC = 3, + channelFilter = null + ) + // Create galaxy from image createGalaxy(images[0]) @@ -144,6 +153,7 @@ class GalaxySketch : BaseSketch(), KoinComponent { } override fun draw() = with(sketch) { + automator.update() val diameterFactor = starDiameterSlider.value beatCounter.update()