Table of Contents
Math expression parser
Motivation
In order to fill a wavetable with waves, a tool is needed to make this task as simple and effective as possible. So the idea to do it with the help of some math was born. An expression parser takes a formula as input and after evaluation all wavetable data gets visualized and can be dumped to the blofeld.
How it works
Two variables are set automatically, that is:
x moves from 0.0 to 1.0 for all 128 samples in a wave.a y moves from 0.0 to 1.0 for each table entry in the range [0..64]
Overview of implemented operators
- Basic operators: +, -, * (multiply) and / (divide)
- % Mod operator
- Exponentiation operator: ^
- Negation: unary -
- Assignment: =
- Log functions: log(), log2(), ln(), exp()
- Transcendental functions: sin(), cos(), tan(), asin(), acos(), atan(), sinh(), cosh(), tanh(), asinh(), acosh(), atanh()
- Square root function: sqrt()
- Rounding functions: ceil(), floor(), round(), trunc(), rint(), near()
- Angular conversion functions: dtor(), rtod()
- Absolute value function: abs()
- Constants: pi
Example expressions
- Sawtooth: 2*x-1
- Rectangle: 2*round(x)-1
- Approximated sawtooth
-
- 0.5 - 1/pi * (sin(2*pi*x) + sin(4*pi*x)/2 + sin(6*pi*x)/3 + sin(8*pi*x)/4) + sin(10*x*pi)/5
- 2/pi * (-sin(2*pi*x) + sin(4*pi*x)/2 - sin(6*pi*x)/3 + sin(8*pi*x)/4) - sin(10*x*pi)/5
- Approximated rectangle
-
- 4/pi * (sin(2*pi*x) + sin(6*pi*x)/3 + sin(10*pi*x)/5 + sin(14*pi*x)/7 + sin(18*pi*x)/9
- 3-bit sampled sine function: round(sin(x*2*pi) * 4)/4
Gaussian tone burst
Gauss-Funktion für einen Vektor http://etools.fernuni.ch/matlab/matlab3/de/html/loops_learningObject4.html
Mittelwert m und Standardabweichung s s=0.5 m=pi/2 4/(2*sqrt(2*pi)) * exp(-1/2*((x*pi-m)/s)^2) * sin(16*pi*x)
Implementation
GCMathParser is a Cocoa class © 2006-2008 Graham Cox
It uses ZExpParser MacZoop expression parser
The Xcode project compiles fine, just set SDKROOT = macosx and replace cString with UTF8String (in general is a much better choice when converting arbitrary NSStrings into 8-bit representations)
GCMathParser* parser = [GCMathParser parser]; NSString* expression = @"sin(x)"; for (int sampleIndex = 0; sampleIndex < 64; sampleIndex++) { double x = sampleIndex / 64.; [parser setSymbolValue:x forKey:@"x"]; wave[sampleIndex] = [parser evaluate:expression]; }
Another parser on the web is https://github.com/davedelong/DDMathParser