/** * This file is a part of JaC64 - a Java C64 Emulator * Main Developer: Joakim Eriksson (Dreamfabric.com) * Contact: joakime@sics.se * Web: http://www.dreamfabric.com/c64 * --------------------------------------------------- */ package com.dreamfabric.jac64; /** * Describe class MoogFilter here. * * * Created: Thu Nov 03 07:55:19 2005 * * @author <a href="mailto:Joakim@BOTBOX"></a> * @version 1.0 */ public class MoogFilter { private int samplingFrq; private double f; private double k; private double p; private double r; // The filter execution registers private double y1; private double y2; private double y3; private double y4; private double oldx; private double oldy1; private double oldy2; private double oldy3; private double yMax; private double yMin; // ------------------------------------------------------------------- // CSound code - Moog filter - try it out!!! // ------------------------------------------------------------------- /** * Creates a new <code>MoogFilter</code> instance. * */ public MoogFilter(int sfrq) { samplingFrq = sfrq; } public void printStatus() { System.out.println("yMax: " + yMax); System.out.println("yMin: " + yMin); } public void setFilterParams(int cutoff, double res) { f = 2.0 * cutoff / samplingFrq; //[0 - 1] k = 3.6 * f - 1.6 * f * f - 1.0; //(Empirical tunning) p = (k + 1) * 0.5; double scale = Math.exp(( (1 - p) * 1.386249)); r = res * scale; } public void performFilter(int buffer[], int len) { for (int i = 0, n = len; i < n; i++) { //--Inverted feed back for corner peaking double x = (buffer[i] / 32768.0) - r * y4; if (buffer[i] != 0) { // System.out.println("B[i]=" + buffer[i] + " x= " + x + " y1:" + y1); } //Four cascaded onepole filters (bilinear transform) y1 = x * p + oldx * p - k * y1; y2 = y1 * p + oldy1 * p - k * y2; y3 = y2 * p + oldy2 * p - k * y3; y4 = y3 * p + oldy3 * p - k * y4; //Clipper band limited sigmoid y4 = y4 - (y4 * y4 * y4) / 6.0; oldx = x; oldy1 = y1; oldy2 = y2; oldy3 = y3; // Ensure no-wrap-overs. if (y4 > yMax) yMax = y4; if (y4 < yMin) yMin = y4; // Dist // y4 = y4 * 2.3; if (y4 > 0.9) { y4 = 0.9; } if (y4 < -0.9) { y4 = -0.9; } buffer[i] = (int) (y4 * 32768.0); } } }