diff --git a/src/soundtrack/optical/Library.java b/src/soundtrack/optical/Library.java new file mode 100644 index 0000000..e144c83 --- /dev/null +++ b/src/soundtrack/optical/Library.java @@ -0,0 +1,114 @@ +package optical_soundtrack; + +import processing.sound.*; +import processing.core.*; + +public class Soundtrack { + String TYPE = "dual variable area"; //type of soundtrack + int DPI = 2880; //dots/in + boolean POSITIVE = true; + float VOLUME = 1.0; + String pitch = "long"; + //String filePath = "wavTones.com.unregistred.sweep_100Hz_6000Hz_-3dBFS_5s.wav"; + String FILEPATH = "barking.wav"; + + float IN = 25.4; //mm/in + float FRAME_H = 7.62; //mm + float FRAME_W = 12.52 - 10.26;; //mm + + float DPMM = DPI / IN; + int FRAME_H_PIXELS = round(DPMM * FRAME_H); + int SAMPLE_RATE = FRAME_H_PIXELS * 24; + int DEPTH = round(DPMM * FRAME_W); + + int LINE_W = 0; + float DENSITY = 0; + int LEFT = 0; + int FRAMES = 0; + int i = 0; + + float max = 0; + float min = 0; + float compare; + + Sound s; + AudioSample sample; + float[] frameSample = new float[FRAME_H_PIXELS]; + SoundFile soundfile; + + Soundtrack (PApplet parent, String soundtrackFile, int dpi, float volume, String type, String pitch, boolean positive ) { + FILEPATH = soundtrackFile; + TYPE = type; + DPI = dpi; + VOLUME = volume; + POSITIVE = positive; + FRAME_H = pitch == "long" ? 7.62 : 7.605; + + DPMM = DPI / IN; + FRAME_H_PIXELS = round(DPMM * FRAME_H); + SAMPLE_RATE = FRAME_H_PIXELS * 24; + DEPTH = floor(DPMM * FRAME_W); + + soundfile = new SoundFile(parent, FILEPATH); + soundfile.rate(SAMPLE_RATE); + + FRAMES = ceil(soundfile.frames() / FRAME_H_PIXELS); + + /* + println("SAMPLE RATE "); + println(SAMPLE_RATE); + println("FRAME_H"); + println(FRAME_H_PIXELS); + println("DEPTH "); + println(DEPTH); + println("FRAMES"); + println(FRAMES); + */ + } + public void frame(int X, int Y) { + if (i >= FRAMES) { + return; + } + + if (POSITIVE) { + background(0); + stroke(255); + } else { + background(255); + stroke(0); + } + + soundfile.read(i * FRAME_H_PIXELS, frameSample, 0, FRAME_H_PIXELS); + + for (int y = 0; y < FRAME_H_PIXELS; y++) { + LINE_W = round(map(frameSample[y], min, max, 0, DEPTH * VOLUME)); + //println(); + if (TYPE == "unilateral") { + line(X + 0, Y + y, X + LINE_W, Y + y); + } else if (TYPE == "dual unilateral") { + /* TODO!!!! */ + } else if (TYPE == "single variable area") { + LEFT = X + round((DEPTH - LINE_W) / 2); + line(LEFT, Y + y, LEFT + LINE_W, Y + y); + } else if (TYPE == "dual variable area") { + LEFT = X + round((DEPTH / 4) - (LINE_W / 4)); + line(LEFT, Y + y, LEFT + (LINE_W / 2), Y + y); + line(LEFT + (DEPTH / 2), Y + y, LEFT + (DEPTH / 2) + (LINE_W / 2), Y + y); + } else if (TYPE == "multiple variable area" || TYPE == "maurer") { + LEFT = X + round((DEPTH / 16) - (LINE_W / 16)); + for (int x = 1; x < 7; x++) { + line(LEFT + ((x * DEPTH) / 8), Y + y, LEFT + ((x * DEPTH) / 8) + (LINE_W / 8), Y + y); + } + } else if (TYPE == "variable density") { + DENSITY = map(frameSample[y], min, max, 0, 255 * VOLUME); + if (POSITIVE) { + stroke(DENSITY); + } else { + stroke(255 - DENSITY); + } + line(X + 0, Y + y, X + DEPTH, Y + y); + } + } + i++; + } +}