diff --git a/.idea/artifacts/skunkworks_jar.xml b/.idea/artifacts/skunkworks_jar.xml
index f4332cc..ce8ca44 100644
--- a/.idea/artifacts/skunkworks_jar.xml
+++ b/.idea/artifacts/skunkworks_jar.xml
@@ -13,6 +13,8 @@
+
+
\ No newline at end of file
diff --git a/.idea/libraries/lwjgl.xml b/.idea/libraries/lwjgl.xml
index e577f96..5d1470d 100644
--- a/.idea/libraries/lwjgl.xml
+++ b/.idea/libraries/lwjgl.xml
@@ -9,12 +9,15 @@
+
+
+
diff --git a/com/danitheskunk/skunkworks/TestSound.java b/com/danitheskunk/skunkworks/TestSound.java
new file mode 100644
index 0000000..da74d6e
--- /dev/null
+++ b/com/danitheskunk/skunkworks/TestSound.java
@@ -0,0 +1,76 @@
+package com.danitheskunk.skunkworks;
+
+import org.lwjgl.openal.AL;
+import org.lwjgl.openal.ALC;
+
+import javax.sound.sampled.*;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+
+import static org.lwjgl.openal.AL10.*;
+import static org.lwjgl.openal.ALC10.*;
+
+public class TestSound {
+ public static void main(String args[]) {
+ var device = alcOpenDevice((ByteBuffer) null);
+ if(device == 0) {
+ throw new RuntimeException("couldn't init openal device");
+ }
+ var deviceCaps = ALC.createCapabilities(device);
+ var context = alcCreateContext(device, (IntBuffer) null);
+ if(context == 0) {
+ throw new RuntimeException("couldn't create openal context");
+ }
+ alcMakeContextCurrent(context);
+ AL.createCapabilities(deviceCaps);
+
+ var buf = alGenBuffers();
+ int sampleRate = 44100;
+ var samples = new short[sampleRate * 2];
+ for(int i = 0; i < samples.length; ++i) {
+ var s = Math.sin(2 * Math.PI * 220 * i / (double) sampleRate);
+ var s2 = Math.sin(2 * Math.PI * 440 * i / (double) sampleRate +
+ s * 10 * (88200 - i) / 88200);
+ //s = s * s2 * i / 88200;
+ s = s2 * (88200 - i) / 88200;
+ samples[i] = (short) (s * 32760);
+ }
+
+ var bb = ByteBuffer.allocate(samples.length * 2);
+ for(int i = 0; i < samples.length; ++i) {
+ bb.putShort(samples[i]);
+ }
+
+ var bytes = bb.array();
+
+ AudioInputStream audio;
+ var format = new AudioFormat(sampleRate, 16, 1, true, true);
+ audio = new AudioInputStream(
+ new ByteArrayInputStream(bytes),
+ format,
+ bytes.length
+ );
+ try {
+ AudioSystem.write(audio,
+ AudioFileFormat.Type.WAVE,
+ new File("meow.wav")
+ );
+ } catch(IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ alBufferData(buf, AL_FORMAT_MONO16, samples, sampleRate);
+
+ var src = alGenSources();
+ alSourcei(src, AL_BUFFER, buf);
+ alSourcePlay(src);
+ try {
+ Thread.sleep(3000);
+ } catch(InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}