diff options
author | Phil Burk <[email protected]> | 2023-04-10 11:12:50 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2023-04-10 11:12:50 -0700 |
commit | 90db5489c352bc038d6d22e336ac7eefac221ed7 (patch) | |
tree | 645dc5bfab661acff6f10921485c2752dc56ac4d /src/main/java/com/jsyn/dsp | |
parent | a46f8c93193fe8bb1eb7b93e55c85e6f46d5b108 (diff) |
Add PlateReverb, RoomReverb and MultiTapDelay units (#115)
PlateReverb is a simulation of a metal plate based on all-pass delays.
RoomReverb uses a MultiTapDelay for early reflections and a PlateReverb for diffusion.
Add a DSP package with utility classes used to build unit generators.
Add TuneReverb app with faders for experimenting and hearing reverb.
Add unit tests for SimpleDelay.
Co-authored-by: Phil Burk <[email protected]>
Diffstat (limited to 'src/main/java/com/jsyn/dsp')
-rw-r--r-- | src/main/java/com/jsyn/dsp/AllPassDelay.java | 37 | ||||
-rw-r--r-- | src/main/java/com/jsyn/dsp/SimpleDelay.java | 71 |
2 files changed, 108 insertions, 0 deletions
diff --git a/src/main/java/com/jsyn/dsp/AllPassDelay.java b/src/main/java/com/jsyn/dsp/AllPassDelay.java new file mode 100644 index 0000000..4afea19 --- /dev/null +++ b/src/main/java/com/jsyn/dsp/AllPassDelay.java @@ -0,0 +1,37 @@ +/* + * Copyright 2022 Phil Burk + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jsyn.dsp; + +public class AllPassDelay { + private float[] mBuffer; + private int mCursor; + private float mCoefficient = 0.65f; + + public AllPassDelay(int length, float coefficient) { + mBuffer = new float[length]; + mCoefficient = coefficient; + } + + public float process(float input) { + float z = mBuffer[mCursor]; + float x = input - (z * mCoefficient); + mBuffer[mCursor] = x; + mCursor++; + if (mCursor >= mBuffer.length) mCursor = 0; + return z + (x * mCoefficient); + } +} diff --git a/src/main/java/com/jsyn/dsp/SimpleDelay.java b/src/main/java/com/jsyn/dsp/SimpleDelay.java new file mode 100644 index 0000000..b4818c1 --- /dev/null +++ b/src/main/java/com/jsyn/dsp/SimpleDelay.java @@ -0,0 +1,71 @@ +/* + * Copyright 2022 Phil Burk + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jsyn.dsp; + +/** + * Delay line based on a circular buffer. + */ +public class SimpleDelay { + private float[] mBuffer; + private int mCursor; + + public SimpleDelay(int length) { + mBuffer = new float[length]; + } + + /** + * Read a value from the delay line. + * @param position positive delay in frames + * @return delayed value + */ + public float read(int position) { + int index = mCursor - position; + if (index < 0) { + index += mBuffer.length; + } + return mBuffer[index]; + } + + /** + * Write a new value to the head of the delay line. + * This does not advance the cursor. + * @param input sample value + */ + public void write(float input) { + mBuffer[mCursor] = input; + } + + /** + * Advance the cursor position. Wrap around in a circle. + */ + public void advance() { + mCursor++; + if (mCursor >= mBuffer.length) mCursor = 0; + } + + /** + * Add a new value and return the oldest value in the delay line. + * @param input sample value + * @return oldest value + */ + public float process(float input) { + float output = mBuffer[mCursor]; + write(input); + advance(); + return output; + } +} |