Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 62b43e8f32
Fetching contributors…

Cannot retrieve contributors at this time

executable file 334 lines (263 sloc) 8.229 kb
/*
* maximilian.h
* platform independent synthesis library using portaudio or rtaudio
*
* Created by Mick Grierson on 29/12/2009.
* Copyright 2009 Mick Grierson & Strangeloop Limited. All rights reserved.
* Thanks to the Goldsmiths Creative Computing Team.
* Special thanks to Arturo Castro for the PortAudio implementation.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef MAXIMILIAN_H
#define MAXIMILIAN_H
//#define MAXIMILIAN_PORTAUDIO
#define MAXIMILIAN_RT_AUDIO
#include <iostream>
#include <fstream>
#include <string.h>
#include <cstdlib>
#include "math.h"
using namespace std;
#define TWOPI (3.14159*2)
class maxiSettings {
public:
static int sampleRate;
static int channels;
static int bufferSize;
static void setup(int initSampleRate, int initChannels, int initBufferSize) {
maxiSettings::sampleRate = initSampleRate;
maxiSettings::channels = initChannels;
maxiSettings::bufferSize = initBufferSize;
}
};
class maxiOsc {
double frequency;
double phase;
double startphase;
double endphase;
double output;
double tri;
public:
maxiOsc();
double sinewave(double frequency);
double coswave(double frequency);
double phasor(double frequency);
double phasor(double frequency, double startphase, double endphase);
double saw(double frequency);
double triangle(double frequency);
double square(double frequency);
double pulse(double frequency, double duty);
double noise();
double sinebuf(double frequency);
double sinebuf4(double frequency);
void phaseReset(double phaseIn);
};
class maxiEnvelope {
double period;
double output;
double startval;
double currentval;
double nextval;
int isPlaying;
public:
double line(int numberofsegments,double segments[100]);
void trigger(int index,double amp);
int valindex;
double amplitude;
};
class maxiDelayline {
double frequency;
int phase;
double startphase;
double endphase;
double output;
double memory[88200];
public:
maxiDelayline();
double dl(double input, int size, double feedback);
double dl(double input, int size, double feedback, int position);
};
class maxiFilter {
double gain;
double input;
double output;
double inputs[10];
double outputs[10];
double cutoff1;
double x;//speed
double y;//pos
double z;//pole
double c;//filter coefficient
public:
maxiFilter():x(0.0), y(0.0), z(0.0), c(0.0){};
double cutoff;
double resonance;
double lores(double input,double cutoff1, double resonance);
double hires(double input,double cutoff1, double resonance);
double bandpass(double input,double cutoff1, double resonance);
double lopass(double input,double cutoff);
double hipass(double input,double cutoff);
};
class maxiMix {
double input;
double two[2];
double four[4];
double eight[8];
public:
double x;
double y;
double z;
double *stereo(double input,double two[2],double x);
double *quad(double input,double four[4], double x,double y);
double *ambisonic(double input,double eight[8],double x,double y, double z);
};
class maxiSample {
private:
string myPath;
int myChunkSize;
int mySubChunk1Size;
int readChannel;
short myFormat;
int myByteRate;
short myBlockAlign;
short myBitsPerSample;
double position;
double speed;
double output;
public:
int myDataSize;
short myChannels;
int mySampleRate;
long length;
void getLength();
char* myData;
short* temp;
// get/set for the Path property
~maxiSample()
{
if (myData) delete[] myData;
if (temp) delete[] temp;
}
maxiSample():myData(NULL){};
bool load(string fileName, int channel=0);
bool loadOgg(char *filename,int channel=0);
void trigger();
// read a wav file into this class
bool read();
//read an ogg file into this class using stb_vorbis
bool readOgg();
double play();
double playOnce();
double playOnce(double speed);
double play(double speed);
double play(double frequency, double start, double end, double &pos);
double play(double frequency, double start, double end);
double play4(double frequency, double start, double end);
double bufferPlay(unsigned char &bufferin,long length);
double bufferPlay(unsigned char &bufferin,double speed,long length);
double bufferPlay(unsigned char &bufferin,double frequency, double start, double end);
double bufferPlay4(unsigned char &bufferin,double frequency, double start, double end);
bool save()
{
fstream myFile (myPath.c_str(), ios::out | ios::binary);
// write the wav file per the wav file format
myFile.seekp (0, ios::beg);
myFile.write ("RIFF", 4);
myFile.write ((char*) &myChunkSize, 4);
myFile.write ("WAVE", 4);
myFile.write ("fmt ", 4);
myFile.write ((char*) &mySubChunk1Size, 4);
myFile.write ((char*) &myFormat, 2);
myFile.write ((char*) &myChannels, 2);
myFile.write ((char*) &mySampleRate, 4);
myFile.write ((char*) &myByteRate, 4);
myFile.write ((char*) &myBlockAlign, 2);
myFile.write ((char*) &myBitsPerSample, 2);
myFile.write ("data", 4);
myFile.write ((char*) &myDataSize, 4);
myFile.write (myData, myDataSize);
return true;
}
// return a printable summary of the wav file
char *getSummary()
{
char *summary = new char[250];
sprintf(summary, " Format: %d\n Channels: %d\n SampleRate: %d\n ByteRate: %d\n BlockAlign: %d\n BitsPerSample: %d\n DataSize: %d\n", myFormat, myChannels, mySampleRate, myByteRate, myBlockAlign, myBitsPerSample, myDataSize);
std::cout << myDataSize;
return summary;
}
};
class maxiMap {
public:
static double inline linlin(double val, double inMin, double inMax, double outMin, double outMax) {
return ((val - inMin) / (inMax - inMin) * (outMax - outMin)) + outMin;
}
static double inline linexp(double val, double inMin, double inMax, double outMin, double outMax) {
//clipping
val = max(min(val, inMax), inMin);
return pow((outMax / outMin), (val - inMin) / (inMax - inMin)) * outMin;
}
static double inline explin(double val, double inMin, double inMax, double outMin, double outMax) {
//clipping
val = max(min(val, inMax), inMin);
return (log(val/inMin) / log(inMax/inMin) * (outMax - outMin)) + outMin;
}
};
class maxiDyn {
public:
double gate(double input, double threshold=0.9, long holdtime=1, double attack=1, double release=0.9995);
double compressor(double input, double ratio, double threshold=0.9, double attack=1, double release=0.9995);
double input;
double ratio;
double currentRatio;
double threshold;
double output;
double attack;
double release;
double amplitude;
long holdtime;
long holdcount;
int attackphase,holdphase,releasephase;
};
class maxiEnv {
public:
double ar(double input, double attack=1, double release=0.9, long holdtime=1, int trigger=0);
double adsr(double input, double attack=1, double decay=0.99, double sustain=0.125, double release=0.9, long holdtime=1, int trigger=0);
double input;
double output;
double attack;
double decay;
double sustain;
double release;
double amplitude;
int trigger;
long holdtime;
long holdcount;
int attackphase,decayphase,sustainphase,holdphase,releasephase;
};
class convert {
public:
double mtof(int midinote);
};
#endif
Jump to Line
Something went wrong with that request. Please try again.