diff --git a/com/danitheskunk/skunkworks/TestSound.java b/com/danitheskunk/skunkworks/TestSound.java index 5bbf9b0..4d0e51e 100644 --- a/com/danitheskunk/skunkworks/TestSound.java +++ b/com/danitheskunk/skunkworks/TestSound.java @@ -1,6 +1,8 @@ package com.danitheskunk.skunkworks; import com.danitheskunk.skunkworks.audio.AudioEngine; +import com.danitheskunk.skunkworks.audio.nodes.Mixer; +import com.danitheskunk.skunkworks.audio.nodes.Node; import com.danitheskunk.skunkworks.audio.nodes.Sine; import org.lwjgl.openal.AL; import org.lwjgl.openal.ALC; @@ -18,7 +20,14 @@ import static org.lwjgl.openal.ALC10.*; public class TestSound { public static void main(String args[]) throws InterruptedException { var engine = new AudioEngine(44100, 256, 8); - engine.setNode(new Sine(engine, 440)); + var mix = new Mixer(engine, 4); + var sin1 = new Sine(engine, 440); + var sin2 = new Sine(engine, 659.25); + var sin3 = new Sine(engine, 523.25); + Node.connect(sin1, 0, mix, 0); + Node.connect(sin2, 0, mix, 1); + Node.connect(sin3, 0, mix, 2); + engine.setNode(mix); for(int i = 0; i < 120; ++i) { engine.refill(); Thread.sleep(20); diff --git a/com/danitheskunk/skunkworks/audio/nodes/Mixer.java b/com/danitheskunk/skunkworks/audio/nodes/Mixer.java new file mode 100644 index 0000000..f1700ce --- /dev/null +++ b/com/danitheskunk/skunkworks/audio/nodes/Mixer.java @@ -0,0 +1,38 @@ +package com.danitheskunk.skunkworks.audio.nodes; + +import com.danitheskunk.skunkworks.audio.AudioBuffer; +import com.danitheskunk.skunkworks.audio.AudioEngine; + +public class Mixer extends Node { + private int channels; + + public Mixer(AudioEngine engine, int channels) { + super(engine, channels, 1); + this.channels = channels; + } + + @Override + public AudioBuffer getBuffer(int slot) { + var bufs = new AudioBuffer[channels]; + var bufferSize = getEngine().getBufferSize(); + var buf = new AudioBuffer(bufferSize); + + for(int channel = 0; channel < channels; ++channel) { + bufs[channel] = getBufferFromInput(channel); + } + + for(int i = 0; i < bufferSize; ++i) { + double l = 0.0; + double r = 0.0; + for(var inBuf : bufs) { + if(inBuf != null) { + l += inBuf.getLeft(i); + r += inBuf.getRight(i); + } + } + //todo: dividing by channels just temporary mess + buf.setSample(i, l / channels, r / channels); + } + return buf; + } +} diff --git a/com/danitheskunk/skunkworks/audio/nodes/Node.java b/com/danitheskunk/skunkworks/audio/nodes/Node.java index 9b64555..766458a 100644 --- a/com/danitheskunk/skunkworks/audio/nodes/Node.java +++ b/com/danitheskunk/skunkworks/audio/nodes/Node.java @@ -56,4 +56,9 @@ public abstract class Node { } public abstract AudioBuffer getBuffer(int slot); + + protected AudioBuffer getBufferFromInput(int inSlot) { + if(inConnections[inSlot] == null) return null; + return inConnections[inSlot].getBuffer(inConnectionSlots[inSlot]); + } }