From 392484b939c0ea56061887670a9bab80f1c81d00 Mon Sep 17 00:00:00 2001 From: dennisppaul Date: Fri, 24 May 2024 22:27:13 +0200 Subject: [PATCH] added mod tracker --- lib/wellen.jar | Bin 1171138 -> 1177050 bytes ...ampleInstruments09CustomDSPInstrument.java | 3 +- .../TechniquePattern01ModTracker.java | 262 ++++++++++++++++++ 3 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 src/wellen/examples/technique/TechniquePattern01ModTracker.java diff --git a/lib/wellen.jar b/lib/wellen.jar index 654643f19b37a7d07bb251fcf2b69e2837023479..82aeb549188dd2f23e2362d5170d428589d92008 100644 GIT binary patch delta 25177 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 U#*l{M{qp*mYG9bv0lE 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 H08al04)4h! diff --git a/src/wellen/examples/instruments/ExampleInstruments09CustomDSPInstrument.java b/src/wellen/examples/instruments/ExampleInstruments09CustomDSPInstrument.java index 5f1ae67..60ed7bd 100644 --- a/src/wellen/examples/instruments/ExampleInstruments09CustomDSPInstrument.java +++ b/src/wellen/examples/instruments/ExampleInstruments09CustomDSPInstrument.java @@ -332,6 +332,7 @@ public CustomInstrumentSampler(int pID) { mSampler = new Sampler(); mSampler.load(SampleDataSNARE.data); mSampler.enable_loop(false); + mSampler.play(); mReverb = new Reverb(); @@ -341,7 +342,7 @@ public CustomInstrumentSampler(int pID) { /** * called by tone engine to request the next audio sample of the instrument. * - * @return + * @return the next audio sample of the instrument */ public Signal output_signal() { /* `output(Signal)` is called to request a new sample: sampler returns a new sample which is then diff --git a/src/wellen/examples/technique/TechniquePattern01ModTracker.java b/src/wellen/examples/technique/TechniquePattern01ModTracker.java new file mode 100644 index 0000000..42c5bfa --- /dev/null +++ b/src/wellen/examples/technique/TechniquePattern01ModTracker.java @@ -0,0 +1,262 @@ +package wellen.examples.technique; + +import processing.core.PApplet; +import processing.core.PGraphics; +import wellen.Beat; +import wellen.Tone; + +public class TechniquePattern01ModTracker extends PApplet { + + /* + * this example demonstrates how to implement a mod tracker. + */ + + public void settings() { + size(640, 480); + } + + static final int TRACKS = 4; + static final int TRACK_LENGTH = 16; + static final float TRACK_WIDTH = 100; + static final float TRACK_HEIGHT = 25; + + Track[] fTracks; + StepSelected fSelected; + + public void setup() { + textFont(createFont("JetBrains Mono", 11)); + + fTracks = new Track[TRACKS]; + for (int i = 0; i < TRACKS; i++) { + fTracks[i] = new Track(i, TRACK_LENGTH); + } + fSelected = new StepSelected(fTracks); + + Beat.start(this, 120 * 4); + } + + public void draw() { + background(255); + + translate((width - TRACKS * TRACK_WIDTH) * 0.5f, (height - TRACK_LENGTH * TRACK_HEIGHT) * 0.5f); + pushMatrix(); + for (int i = 0; i < fTracks.length; i++) { + fTracks[i].draw(g); + translate(fTracks[i].width, 0); + } + popMatrix(); + + fSelected.draw(g); + } + + public void beat(int beat) { + for (int i = 0; i < TRACKS; i++) { + fTracks[i].play(beat); + } + } + + static class StepSelected { + int x; + int y; + + Step copied_step; + + private final Track[] fTracks; + + StepSelected(Track[] pTracks) { + fTracks = pTracks; + x = 0; + y = 0; + copied_step = new Step(); + } + + void copy() { + copied_step.note = fTracks[x].steps[y].note; + copied_step.velocity = fTracks[x].steps[y].velocity; + } + + void paste() { + fTracks[x].steps[y].note = copied_step.note; + fTracks[x].steps[y].velocity = copied_step.velocity; + } + + void left() { + x--; + if (x < 0) { + x = fTracks.length - 1; + } + } + + void right() { + x++; + if (x >= fTracks.length) { + x = 0; + } + } + + void up() { + y--; + if (y < 0) { + y = fTracks[x].length - 1; + } + } + + void down() { + y++; + if (y >= fTracks[x].length) { + y = 0; + } + } + + void draw(PGraphics g) { + g.strokeWeight(4); + g.stroke(0, 127, 255); + g.noFill(); + g.rect(x * TRACK_WIDTH, y * TRACK_HEIGHT, TRACK_WIDTH, TRACK_HEIGHT); + g.strokeWeight(1); + } + } + + public static class Step { + int note = 0; + int velocity = 100; + } + + public static class Track { + Step[] steps; + final int length; + final int ID; + int current_step = 0; + + float width = TRACK_WIDTH; + float height = TRACK_HEIGHT; + + Track(int pID, int pLength) { + ID = pID; + length = pLength; + steps = new Step[length]; + for (int i = 0; i < length; i++) { + steps[i] = new Step(); + } + } + + void draw(PGraphics g) { + for (int i = 0; i < length; i++) { + /* frame */ + if (i == current_step) { + g.fill(91); + } else { + g.fill(0); + } + g.stroke(255); + g.rect(0, i * height, width, height); + /* value */ + g.fill(255); + final String mNoteName = nf(steps[i].note, 3); + final String mVelocityName = nf(steps[i].velocity, 3); + final String mName = mNoteName + " : " + mVelocityName; + g.textAlign(CENTER, CENTER); + g.text(mName, width * 0.5f, (i + 0.5f) * height); + } + } + + public void play(int beat) { + current_step = beat % length; + int mNote = steps[current_step].note; + if (mNote != 0) { + Tone.instrument(ID).note_on(mNote, steps[current_step].velocity); + } else { + Tone.instrument(ID).note_off(); + } + } + } + + public Step getSelectedStep() { + return fTracks[fSelected.x].steps[fSelected.y]; + } + + private boolean fIsShiftPressed = false; + + public void keyPressed() { + switch (keyCode) { + case LEFT: + if (fIsShiftPressed) { + getSelectedStep().velocity--; + } else { + fSelected.left(); + } + break; + case RIGHT: + if (fIsShiftPressed) { + getSelectedStep().velocity++; + } else { + fSelected.right(); + } + break; + case UP: + if (fIsShiftPressed) { + getSelectedStep().note++; + } else { + fSelected.up(); + } + break; + case DOWN: + if (fIsShiftPressed) { + getSelectedStep().note--; + } else { + fSelected.down(); + } + break; + case BACKSPACE: + case DELETE: + getSelectedStep().note = 0; + break; + case SHIFT: + fIsShiftPressed = true; + break; + } + switch (key) { + case ' ': + getSelectedStep().note = 0; + break; + case 'c': + fSelected.copy(); + break; + case 'v': + fSelected.paste(); + break; + case 'r': + for (Track mTrack : fTracks) { + for (Step mStep : mTrack.steps) { + mStep.note = random(1) > 0.75 ? 36 + (int) random(0, 24) : 0; + } + } + break; + case 'R': + for (Track mTrack : fTracks) { + for (Step mStep : mTrack.steps) { + mStep.velocity = (int) random(0, 120); + } + } + break; + case 'q': + for (Track mTrack : fTracks) { + for (Step mStep : mTrack.steps) { + mStep.note = 0; + mStep.velocity = 100; + } + } + break; + } + } + + public void keyReleased() { + if (keyCode == SHIFT) { + fIsShiftPressed = false; + } + } + + public static void main(String[] args) { + PApplet.main(TechniquePattern01ModTracker.class.getName()); + } +}