User Tools

Site Tools


code:mathparser

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
  • 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

code/mathparser.txt · Last modified: 2015/11/19 15:03 by michfiel