Clean up main.c

This commit is contained in:
Sam Ellicott 2021-03-13 13:58:40 -05:00
parent 472615bbf7
commit 2f89063b6a

View file

@ -1,30 +1,29 @@
//Copyright 2015-2020 <>< Charles Lohr under the ColorChord License. // Copyright 2015-2020 <>< Charles Lohr under the ColorChord License.
#if defined(WINDOWS) || defined(USE_WINDOWS)\ #if defined( WINDOWS ) || defined( USE_WINDOWS ) || defined( WIN32 ) || defined( WIN64 ) || \
|| defined(WIN32) || defined(WIN64) \ defined( _WIN32 ) || defined( _WIN64 )
|| defined(_WIN32) || defined(_WIN64)
#include <winsock2.h>
#include <windows.h> #include <windows.h>
#include <winsock2.h>
#ifndef strdup #ifndef strdup
#define strdup _strdup #define strdup _strdup
#endif #endif
#endif #endif
#include <ctype.h>
#include "color.h" #include "color.h"
#include <math.h> #include "configs.h"
#include <stdio.h> #include "decompose.h"
#include "os_generic.h"
#include "dft.h" #include "dft.h"
#include "filter.h" #include "filter.h"
#include "decompose.h" #include "hook.h"
#include <stdlib.h>
#include <string.h>
#include "notefinder.h" #include "notefinder.h"
#include "os_generic.h"
#include "outdrivers.h" #include "outdrivers.h"
#include "parameters.h" #include "parameters.h"
#include "hook.h" #include <ctype.h>
#include "configs.h" #include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CNFG_IMPLEMENTATION #define CNFG_IMPLEMENTATION
@ -34,20 +33,19 @@
#include "CNFA.h" #include "CNFA.h"
// Sound driver.
//Sound driver. struct CNFADriver *sd;
struct CNFADriver * sd;
int bQuitColorChord = 0; int bQuitColorChord = 0;
#ifdef ANDROID #ifdef ANDROID
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <android/log.h> #include <android/log.h>
#include <fcntl.h>
#include <pthread.h> #include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
void HandleDestroy() void HandleDestroy()
{ {
@ -60,115 +58,103 @@ void HandleDestroy()
#define GENLINEWIDTH 89 #define GENLINEWIDTH 89
#define GENLINES 67 #define GENLINES 67
int genlinelen = 0; char genlog[ ( GENLINEWIDTH + 1 ) * ( GENLINES + 1 ) + 2 ] = "log";
char genlog[(GENLINEWIDTH+1)*(GENLINES+1)+2] = "log";
int genloglen; int genloglen;
int genloglines; int genloglines;
int genlinelen = 0;
int firstnewline = -1; int firstnewline = -1;
void example_log_function( int readSize, char * buf ) void example_log_function( int readSize, char *buf )
{ {
static og_mutex_t * mt; static og_mutex_t *mt;
if( !mt ) mt = OGCreateMutex(); if ( !mt ) mt = OGCreateMutex();
OGLockMutex( mt ); OGLockMutex( mt );
int i; for ( int i = 0; readSize && i <= readSize && buf[ i ]; i++ )
for( i = 0; (readSize>=0)?(i <= readSize):buf[i]; i++ )
{ {
char c = buf[i]; char c = buf[ i ];
if( c == '\0' ) c = '\n'; if ( c == '\0' ) c = '\n';
if( ( c != '\n' && genlinelen >= GENLINEWIDTH ) || c == '\n' ) if ( ( c != '\n' && genlinelen >= GENLINEWIDTH ) || c == '\n' )
{ {
int k;
genloglines++; genloglines++;
if( genloglines >= GENLINES ) if ( genloglines >= GENLINES )
{ {
genloglen -= firstnewline+1; genloglen -= firstnewline + 1;
int offset = firstnewline; int offset = firstnewline;
firstnewline = -1; firstnewline = -1;
int k;
for( k = 0; k < genloglen; k++ ) for ( k = 0; k < genloglen; k++ )
{ {
if( ( genlog[k] = genlog[k+offset+1] ) == '\n' && firstnewline < 0) if ( ( genlog[ k ] = genlog[ k + offset + 1 ] ) == '\n' && firstnewline < 0 )
{
firstnewline = k; firstnewline = k;
} }
} genlog[ k ] = 0;
genlog[k] = 0;
genloglines--; genloglines--;
} }
genlinelen = 0; genlinelen = 0;
if( c != '\n' ) if ( c != '\n' )
{ {
genlog[genloglen+1] = 0; genlog[ genloglen + 1 ] = 0;
genlog[genloglen++] = '\n'; genlog[ genloglen++ ] = '\n';
} }
if( firstnewline < 0 ) firstnewline = genloglen; if ( firstnewline < 0 ) firstnewline = genloglen;
} }
genlog[genloglen+1] = 0; genlog[ genloglen + 1 ] = 0;
genlog[genloglen++] = c; genlog[ genloglen++ ] = c;
if( c != '\n' ) genlinelen++; if ( c != '\n' ) genlinelen++;
} }
OGUnlockMutex( mt ); OGUnlockMutex( mt );
} }
#if defined( WIN32 ) || defined( USE_WINDOWS )
#if defined(WIN32) || defined(USE_WINDOWS)
#define ESCAPE_KEY 0x1B #define ESCAPE_KEY 0x1B
void HandleDestroy() void HandleDestroy()
{ {
CNFAClose( sd ); CNFAClose( sd );
} }
#else #else
#define ESCAPE_KEY 65307 #define ESCAPE_KEY 65307
#endif #endif
int is_suspended = 0;
float DeltaFrameTime = 0; float DeltaFrameTime = 0;
double Now = 0; double Now = 0;
int is_suspended = 0;
int lastfps; int lastfps;
short screenx, screeny; short screenx, screeny;
struct DriverInstances * outdriver[MAX_OUT_DRIVERS]; struct DriverInstances *outdriver[ MAX_OUT_DRIVERS ];
int headless = 0; REGISTER_PARAM( headless, PAINT );
int headless = 0; REGISTER_PARAM( headless, PAINT ); int set_screenx = 640; REGISTER_PARAM( set_screenx, PAINT );
int set_screenx = 640; REGISTER_PARAM( set_screenx, PAINT ); int set_screeny = 480; REGISTER_PARAM( set_screeny, PAINT );
int set_screeny = 480; REGISTER_PARAM( set_screeny, PAINT ); char sound_source[ 16 ]; REGISTER_PARAM( sound_source, PABUFFER );
char sound_source[16]; REGISTER_PARAM( sound_source, PABUFFER ); int cpu_autolimit = 1; REGISTER_PARAM( cpu_autolimit, PAINT );
int cpu_autolimit = 1; REGISTER_PARAM( cpu_autolimit, PAINT );
float cpu_autolimit_interval = 0.016; REGISTER_PARAM( cpu_autolimit_interval, PAFLOAT ); float cpu_autolimit_interval = 0.016; REGISTER_PARAM( cpu_autolimit_interval, PAFLOAT );
int sample_channel = -1; REGISTER_PARAM( sample_channel, PAINT ); int sample_channel = -1; REGISTER_PARAM( sample_channel, PAINT );
int showfps = 1; REGISTER_PARAM( showfps, PAINT ); int showfps = 1; REGISTER_PARAM( showfps, PAINT );
#if defined(ANDROID) || defined( __android__ ) #if defined( ANDROID ) || defined( __android__ )
float in_amplitude = 2; float in_amplitude = 2;
#else #else
float in_amplitude = 1; float in_amplitude = 1;
#endif #endif
REGISTER_PARAM( in_amplitude, PAFLOAT ); REGISTER_PARAM( in_amplitude, PAFLOAT );
struct NoteFinder * nf; struct NoteFinder *nf;
//Sound circular buffer // Sound circular buffer
#define SOUNDCBSIZE 8096 #define SOUNDCBSIZE 8096
#define MAX_CHANNELS 2 #define MAX_CHANNELS 2
double VisTimeEnd, VisTimeStart; double VisTimeEnd, VisTimeStart;
int soundhead = 0; float sound[ SOUNDCBSIZE ];
float sound[SOUNDCBSIZE]; int soundhead = 0;
int show_debug = 0; int show_debug = 0;
int show_debug_basic = 1; int show_debug_basic = 1;
int gKey = 0; int gKey = 0;
@ -176,53 +162,48 @@ extern int force_white;
void RecalcBaseHz() void RecalcBaseHz()
{ {
nf->base_hz = 55 * pow( 2, gKey / 12.0 ); ChangeNFParameters( nf ); nf->base_hz = 55 * pow( 2, gKey / 12.0 );
ChangeNFParameters( nf );
} }
void HandleKey( int keycode, int bDown ) void HandleKey( int keycode, int bDown )
{ {
char c = toupper( keycode ); char c = toupper( keycode );
#ifdef ANDROID #ifdef ANDROID
if( keycode == 4 && bDown ) if ( keycode == 4 && bDown )
{ {
//Back button. // Back button.
printf( "Back button pressed\n" ); printf( "Back button pressed\n" );
AndroidSendToBack( 0 ); AndroidSendToBack( 0 );
return; return;
} }
#endif #endif
if( c == 'D' && bDown ) show_debug = !show_debug;
if( c == 'W' ) force_white = bDown;
if( c == '9' && bDown ) { gKey--; RecalcBaseHz(); }
if( c == '-' && bDown ) { gKey++; RecalcBaseHz(); }
if( c == '0' && bDown ) { gKey = 0; RecalcBaseHz(); }
if( c == 'E' && bDown ) show_debug_basic = !show_debug_basic;
if( c == 'K' && bDown ) DumpParameters();
if( keycode == ESCAPE_KEY ) exit( 0 ); if( keycode == ESCAPE_KEY ) exit( 0 );
if( c == 'W' ) force_white = bDown;
if( c == 'D' && bDown ) show_debug = !show_debug;
if( c == '9' && bDown ) { gKey--; RecalcBaseHz(); }
if( c == '-' && bDown ) { gKey++; RecalcBaseHz(); }
if( c == '0' && bDown ) { gKey = 0; RecalcBaseHz(); }
if( c == 'E' && bDown ) show_debug_basic = !show_debug_basic;
if( c == 'K' && bDown ) DumpParameters();
printf( "Key: %d -> %d\n", keycode, bDown ); printf( "Key: %d -> %d\n", keycode, bDown );
KeyHappened( keycode, bDown ); KeyHappened( keycode, bDown );
} }
//On Android we want a really basic GUI // On Android we want a really basic GUI
void HandleButton( int x, int y, int button, int bDown ) void HandleButton( int x, int y, int button, int bDown )
{ {
printf( "Button: %d,%d (%d) -> %d\n", x, y, button, bDown ); printf( "Button: %d,%d (%d) -> %d\n", x, y, button, bDown );
if( bDown ) if ( bDown )
{ {
if( y < 800 ) if ( y < 800 )
{ {
if( x < screenx/3 ) if ( x < screenx / 3 )
{ gKey--;
gKey --; else if ( x < ( screenx * 2 / 3 ) )
}
else if( x < (screenx*2/3) )
{
gKey = 0; gKey = 0;
}
else else
{
gKey++; gKey++;
}
printf( "KEY: %d\n", gKey ); printf( "KEY: %d\n", gKey );
RecalcBaseHz(); RecalcBaseHz();
} }
@ -233,72 +214,48 @@ void HandleMotion( int x, int y, int mask )
{ {
} }
void SoundCB( struct CNFADriver * sd, short * out, short * in, int framesp, int framesr ) void SoundCB( struct CNFADriver *sd, short *out, short *in, int framesp, int framesr )
{ {
int channelin = sd->channelsRec; int channelin = sd->channelsRec;
int channelout = sd->channelsPlay; int channelout = sd->channelsPlay;
//*samplesp = 0;
// int process_channels = (MAX_CHANNELS < channelin)?MAX_CHANNELS:channelin;
//Load the samples into a ring buffer. Split the channels from interleved to one per buffer. // Load the samples into a ring buffer. Split the channels from interleved to one per buffer.
if ( in )
int i;
int j;
if( in )
{ {
for( i = 0; i < framesr; i++ ) for ( int i = 0; i < framesr; i++ )
{ {
if( sample_channel < 0 ) if ( sample_channel < 0 )
{ {
float fo = 0; float fo = 0;
for( j = 0; j < channelin; j++ ) for ( int j = 0; j < channelin; j++ )
{ {
float f = in[i*channelin+j] / 32767.; float f = in[ i * channelin + j ] / 32767.;
if( f >= -1 && f <= 1 ) if ( f >= -1 && f <= 1 )
{
fo += f; fo += f;
}
else else
{ fo += ( f > 0 ) ? 1 : -1;
fo += (f>0)?1:-1;
// printf( "Sound fault A %d/%d %d/%d %f\n", j, channelin, i, samplesr, f );
} }
}
fo /= channelin; fo /= channelin;
sound[soundhead] = fo*in_amplitude; sound[ soundhead ] = fo * in_amplitude;
soundhead = (soundhead+1)%SOUNDCBSIZE; soundhead = ( soundhead + 1 ) % SOUNDCBSIZE;
} }
else else
{ {
float f = in[i*channelin+sample_channel] / 32767.; float f = in[ i * channelin + sample_channel ] / 32767.;
if ( f > 1 || f < -1 ) f = ( f > 0 ) ? 1 : -1;
if( f > 1 || f < -1 ) sound[ soundhead ] = f * in_amplitude;
{ soundhead = ( soundhead + 1 ) % SOUNDCBSIZE;
f = (f>0)?1:-1;
} }
//printf( "Sound fault B %d/%d\n", i, samplesr );
sound[soundhead] = f*in_amplitude;
soundhead = (soundhead+1)%SOUNDCBSIZE;
}
} }
SoundEventHappened( framesr, in, 0, channelin ); SoundEventHappened( framesr, in, 0, channelin );
} }
if( out ) if ( out )
{ {
for( j = 0; j < framesp * channelout; j++ ) memset(out, 0, framesp * channelout);
{
out[j] = 0;
}
SoundEventHappened( framesp, out, 1, channelout ); SoundEventHappened( framesp, out, 1, channelout );
} }
} }
#ifdef ANDROID #ifdef ANDROID
@ -315,7 +272,8 @@ void HandleResume()
// function for calling initilization functions if we are using TCC // function for calling initilization functions if we are using TCC
#ifdef TCC #ifdef TCC
void RegisterConstructorFunctions(){ void RegisterConstructorFunctions()
{
// Basic Window stuff // Basic Window stuff
REGISTERheadless(); REGISTERheadless();
@ -336,59 +294,53 @@ void RegisterConstructorFunctions(){
// Video Stuff // Video Stuff
REGISTERnull(); REGISTERnull();
REGISTERDisplayArray(); REGISTERDisplayArray();
//REGISTERDisplayDMX(); // REGISTERDisplayDMX();
//REGISTERDisplayFileWrite(); // REGISTERDisplayFileWrite();
REGISTERDisplayHIDAPI(); REGISTERDisplayHIDAPI();
REGISTERDisplayNetwork(); REGISTERDisplayNetwork();
REGISTERDisplayOutDriver(); REGISTERDisplayOutDriver();
REGISTERDisplayPie(); REGISTERDisplayPie();
//REGISTERDisplaySHM(); // REGISTERDisplaySHM();
// Output stuff // Output stuff
//REGISTERDisplayUSB2812(); // REGISTERDisplayUSB2812();
REGISTEROutputCells(); REGISTEROutputCells();
REGISTEROutputLinear(); REGISTEROutputLinear();
REGISTEROutputProminent(); REGISTEROutputProminent();
REGISTEROutputVoronoi(); REGISTEROutputVoronoi();
//REGISTERRecorderPlugin();
//void ManuallyRegisterDevices();
//ManuallyRegisterDevices();
} }
#endif #endif
int main(int argc, char ** argv) int main( int argc, char **argv )
{ {
int i;
#ifdef TCC #ifdef TCC
RegisterConstructorFunctions(); RegisterConstructorFunctions();
#endif #endif
printf( "Output Drivers:\n" ); printf( "Output Drivers:\n" );
for( i = 0; i < MAX_OUT_DRIVERS; i++ ) for ( int i = 0; i < MAX_OUT_DRIVERS; i++ )
{ {
if( ODList[i].Name ) printf( "\t%s\n", ODList[i].Name ); if ( ODList[ i ].Name ) printf( "\t%s\n", ODList[ i ].Name );
} }
#if defined(WIN32) || defined(USE_WINDOWS) #if defined( WIN32 ) || defined( USE_WINDOWS )
//In case something needs network access. // In case something needs network access.
WSADATA wsaData; WSADATA wsaData;
WSAStartup(0x202, &wsaData); WSAStartup( 0x202, &wsaData );
#elif defined( ANDROID ) #elif defined( ANDROID )
int hasperm = AndroidHasPermissions( "READ_EXTERNAL_STORAGE" ); int hasperm = AndroidHasPermissions( "READ_EXTERNAL_STORAGE" );
if( !hasperm ) if ( !hasperm )
{ {
AndroidRequestAppPermissions( "READ_EXTERNAL_STORAGE" ); AndroidRequestAppPermissions( "READ_EXTERNAL_STORAGE" );
} }
int haspermInternet = AndroidHasPermissions( "INTERNET" ); int haspermInternet = AndroidHasPermissions( "INTERNET" );
if( !haspermInternet ) if ( !haspermInternet )
{ {
AndroidRequestAppPermissions( "INTERNET" ); AndroidRequestAppPermissions( "INTERNET" );
} }
#else #else
//Linux // Linux
#endif #endif
gargc = argc; gargc = argc;
@ -396,103 +348,91 @@ int main(int argc, char ** argv)
SetupConfigs(); SetupConfigs();
//Initialize Rawdraw // Initialize Rawdraw
int frames = 0; int frames = 0;
double ThisTime; double ThisTime;
double LastFPSTime = OGGetAbsoluteTime(); double LastFPSTime = OGGetAbsoluteTime();
double LastFrameTime = OGGetAbsoluteTime(); double LastFrameTime = OGGetAbsoluteTime();
double SecToWait; double SecToWait;
CNFGBGColor = 0x800000; CNFGBGColor = 0x800000;
CNFGDialogColor = 0x444444; CNFGDialogColor = 0x444444;
char title[1024]; // Generate the window title
char * tp = title; char title[ 1024 ];
strcpy( title, "Colorchord " );
memcpy( tp, "ColorChord ", strlen( "ColorChord " ) ); for ( int i = 1; i < argc; i++ )
tp += strlen( "ColorChord " );
for( i = 1; i < argc; i++ )
{ {
memcpy( tp, argv[i], strlen( argv[i] ) ); strcat( title, argv[ i ] );
tp += strlen( argv[i] ); strcat( title, " " );
*tp = ' ';
tp++;
} }
*tp = 0; if ( !headless ) CNFGSetup( title, set_screenx, set_screeny );
if( !headless )
CNFGSetup( title, set_screenx, set_screeny );
char * OutDriverNames = strdup( GetParameterS( "outdrivers", "null" ) ); char *OutDriverNames = strdup( GetParameterS( "outdrivers", "null" ) );
char * ThisDriver = OutDriverNames; char *ThisDriver = OutDriverNames;
char * TDStart; char *TDStart;
for( i = 0; i < MAX_OUT_DRIVERS; i++ ) for ( int i = 0; i < MAX_OUT_DRIVERS; i++ )
{ {
while( *ThisDriver == ' ' || *ThisDriver == '\t' ) ThisDriver++; while ( *ThisDriver == ' ' || *ThisDriver == '\t' ) ThisDriver++;
if( !*ThisDriver ) break; if ( !*ThisDriver ) break;
TDStart = ThisDriver; TDStart = ThisDriver;
while( *ThisDriver != 0 && *ThisDriver != ',' ) while ( *ThisDriver != 0 && *ThisDriver != ',' )
{ {
if( *ThisDriver == '\t' || *ThisDriver == ' ' ) *ThisDriver = 0; if ( *ThisDriver == '\t' || *ThisDriver == ' ' ) *ThisDriver = 0;
ThisDriver++; ThisDriver++;
} }
if( *ThisDriver ) if ( *ThisDriver )
{ {
*ThisDriver = 0; *ThisDriver = 0;
ThisDriver++; ThisDriver++;
} }
printf( "Loading: %s\n", TDStart ); printf( "Loading: %s\n", TDStart );
outdriver[i] = SetupOutDriver( TDStart ); outdriver[ i ] = SetupOutDriver( TDStart );
} }
free(OutDriverNames); free( OutDriverNames );
do do
{ {
//Initialize Sound // Initialize Sound
sd = CNFAInit( sound_source, "colorchord", &SoundCB, sd = CNFAInit( sound_source, "colorchord", &SoundCB, GetParameterI( "samplerate", 44100 ),
GetParameterI( "samplerate", 44100 ), GetParameterI( "samplerate", 44100 ), GetParameterI( "samplerate", 44100 ), GetParameterI( "channels", 2 ),
GetParameterI( "channels", 2 ), GetParameterI( "channels", 2 ), GetParameterI( "channels", 2 ), GetParameterI( "buffer", 1024 ),
GetParameterI( "buffer", 1024 ),
GetParameterS( "devplay", 0 ), GetParameterS( "devrecord", 0 ), NULL ); GetParameterS( "devplay", 0 ), GetParameterS( "devrecord", 0 ), NULL );
if( sd ) break; if ( sd ) break;
CNFGColor( 0xffffff ); CNFGColor( 0xffffff );
CNFGPenX = 10; CNFGPenY = 100; CNFGPenX = 10;
CNFGPenY = 100;
CNFGHandleInput(); CNFGHandleInput();
CNFGClearFrame(); CNFGClearFrame();
CNFGDrawText( "Colorchord must be used with sound. Sound not available.", 10 ); CNFGDrawText( "Colorchord must be used with sound. Sound not available.", 10 );
CNFGSwapBuffers(); CNFGSwapBuffers();
OGSleep(1); OGSleep( 1 );
} while( 1 ); } while ( 1 );
nf = CreateNoteFinder( sd->spsRec ); nf = CreateNoteFinder( sd->spsRec );
//Once everything was reinitialized, re-read the ini files. // Once everything was reinitialized, re-read the ini files.
SetEnvValues( 1 ); SetEnvValues( 1 );
printf( "================================================= Set Up\n" ); printf( "================================================= Set Up\n" );
Now = OGGetAbsoluteTime(); Now = OGGetAbsoluteTime();
double Last = Now; double Last = Now;
#ifdef ANDROID while ( !bQuitColorChord )
while(!bQuitColorChord)
#else
while(!bQuitColorChord)
#endif
{ {
char stt[1024]; char stt[ 1024 ];
//Handle Rawdraw frame swappign // Handle Rawdraw frame swappign
Now = OGGetAbsoluteTime(); Now = OGGetAbsoluteTime();
DeltaFrameTime = Now - Last; DeltaFrameTime = Now - Last;
if( !headless ) if ( !headless )
{ {
CNFGHandleInput(); CNFGHandleInput();
CNFGClearFrame(); CNFGClearFrame();
@ -500,188 +440,192 @@ int main(int argc, char ** argv)
CNFGGetDimensions( &screenx, &screeny ); CNFGGetDimensions( &screenx, &screeny );
} }
RunNoteFinder( nf, sound, (soundhead-1+SOUNDCBSIZE)%SOUNDCBSIZE, SOUNDCBSIZE ); RunNoteFinder( nf, sound, ( soundhead - 1 + SOUNDCBSIZE ) % SOUNDCBSIZE, SOUNDCBSIZE );
//Done all ColorChord work. // Done all ColorChord work.
VisTimeStart = OGGetAbsoluteTime(); VisTimeStart = OGGetAbsoluteTime();
for( i = 0; i < MAX_OUT_DRIVERS; i++ ) // call the output drivers with the updated note finder data
for ( int i = 0; i < MAX_OUT_DRIVERS; i++ )
{ {
if ( force_white ) memset( OutLEDs, 0x7f, MAX_LEDS * 3 );
if( force_white ) if ( outdriver[ i ] ) outdriver[ i ]->Func( outdriver[ i ]->id, nf );
{
memset( OutLEDs, 0x7f, MAX_LEDS*3 );
}
if( outdriver[i] )
outdriver[i]->Func( outdriver[i]->id, nf );
} }
VisTimeEnd = OGGetAbsoluteTime(); VisTimeEnd = OGGetAbsoluteTime();
if( !headless ) if ( !headless )
{ {
//Handle outputs. // Handle outputs.
int freqbins = nf->freqbins; int freqbins = nf->freqbins;
int note_peaks = freqbins/2; int note_peaks = freqbins / 2;
int freqs = freqbins * nf->octaves; int freqs = freqbins * nf->octaves;
//int maxdists = freqbins/2;
//Do a bunch of debugging. // Do a bunch of debugging.
if( show_debug_basic && !is_suspended ) if ( show_debug_basic && !is_suspended )
{ {
//char sttdebug[1024]; for ( int i = 0; i < nf->dists_count; i++ )
//char * sttend = sttdebug;
for( i = 0; i < nf->dists_count; i++ )
{ {
CNFGPenX = (nf->dists[i].mean + 0.5) / freqbins * screenx; //Move over 0.5 for visual purposes. The means is correct. // Move over 0.5 for visual purposes. The means is correct.
CNFGPenY = 400-nf->dists[i].amp * 150.0 / nf->dists[i].sigma; CNFGPenX = ( nf->dists[ i ].mean + 0.5 ) / freqbins * screenx;
//printf( "%f %f\n", dists[i].mean, dists[i].amp ); CNFGPenY = 400 - nf->dists[ i ].amp * 150.0 / nf->dists[ i ].sigma;
sprintf( stt, "%f\n%f\n", nf->dists[i].mean, nf->dists[i].amp ); sprintf( stt, "%f\n%f\n", nf->dists[ i ].mean, nf->dists[ i ].amp );
// sttend += sprintf( sttend, "%f/%f ",nf->dists[i].mean, nf->dists[i].amp );
CNFGDrawText( stt, 2 ); CNFGDrawText( stt, 2 );
} }
CNFGColor( 0xffffff ); CNFGColor( 0xffffff );
//Draw the folded bins // Draw the folded bins
for( i = 0; i < freqbins; i++ ) for ( int bin = 0; bin < freqbins; bin++ )
{ {
float x0 = i / (float)freqbins * (float)screenx; const float x0 = bin / ( float )freqbins * ( float )screenx;
float x1 = (i+1) / (float)freqbins * (float)screenx; const float x1 = ( bin + 1 ) / ( float )freqbins * ( float )screenx;
float amp = nf->folded_bins[i] * 250.0; const float amp = nf->folded_bins[ bin ] * 250.0;
CNFGDialogColor = CCtoHEX( ((float)(i+0.5) / freqbins), 1.0, 1.0 ); const float note = ( float )( bin + 0.5 ) / freqbins;
CNFGDrawBox( x0, 400-amp, x1, 400 ); CNFGDialogColor = CCtoHEX( note, 1.0, 1.0 );
CNFGDrawBox( x0, 400 - amp, x1, 400 );
} }
CNFGDialogColor = 0xf0f000; CNFGDialogColor = 0xf0f000;
for( i = 0; i < note_peaks; i++ ) // Draw the note peaks
for ( int peak = 0; peak < note_peaks; peak++ )
{ {
//printf( "%f %f /", note_positions[i], note_amplitudes[i] ); if ( nf->note_amplitudes_out[ peak ] < 0 ) continue;
if( nf->note_amplitudes_out[i] < 0 ) continue; float note = ( float )nf->note_positions[ peak ] / freqbins;
float note = (float) nf->note_positions[i] / freqbins;
CNFGDialogColor = CCtoHEX( note, 1.0, 1.0 ); CNFGDialogColor = CCtoHEX( note, 1.0, 1.0 );
CNFGDrawBox( ((float)i / note_peaks) * screenx, 480 - nf->note_amplitudes_out[i] * 100, ((float)(i+1) / note_peaks) * screenx, 480 ); const int x1 = ( ( float )peak / note_peaks ) * screenx;
CNFGPenX = ((float)(i+.4) / note_peaks) * screenx; const int x2 = ( ( float )( peak + 1 ) / note_peaks ) * screenx;
const int y1 = 480 - nf->note_amplitudes_out[ peak ] * 100;
const int y2 = 480;
CNFGDrawBox( x1, y1, x2, y2 );
CNFGPenX = ( ( float )( i + .4 ) / note_peaks ) * screenx;
CNFGPenY = screeny - 30; CNFGPenY = screeny - 30;
sprintf( stt, "%d\n%0.0f", nf->enduring_note_id[i], nf->note_amplitudes2[i]*1000.0 ); sprintf( stt, "%d\n%0.0f", nf->enduring_note_id[ i ],
//sttend += sprintf( sttend, "%5d/%5.0f ", nf->enduring_note_id[i], nf->note_amplitudes2[i]*1000.0 ); nf->note_amplitudes2[ i ] * 1000.0 );
CNFGDrawText( stt, 2 ); CNFGDrawText( stt, 2 );
} }
//Let's draw the o-scope. // Let's draw the o-scope.
int thissoundhead = soundhead; int thissoundhead = soundhead;
thissoundhead = (thissoundhead-1+SOUNDCBSIZE)%SOUNDCBSIZE; thissoundhead = ( thissoundhead - 1 + SOUNDCBSIZE ) % SOUNDCBSIZE;
int lasty = sound[thissoundhead] * 128 + 128; thissoundhead = (thissoundhead-1+SOUNDCBSIZE)%SOUNDCBSIZE; int lasty = sound[ thissoundhead ] * 128 + 128;
int thisy = sound[thissoundhead] * 128 + 128; thissoundhead = (thissoundhead-1+SOUNDCBSIZE)%SOUNDCBSIZE; thissoundhead = ( thissoundhead - 1 + SOUNDCBSIZE ) % SOUNDCBSIZE;
for( i = 0; i < screenx; i++ ) int thisy = sound[ thissoundhead ] * 128 + 128;
thissoundhead = ( thissoundhead - 1 + SOUNDCBSIZE ) % SOUNDCBSIZE;
for ( int i = 0; i < screenx; i++ )
{ {
CNFGTackSegment( i, lasty, i+1, thisy ); CNFGTackSegment( i, lasty, i + 1, thisy );
lasty = thisy; lasty = thisy;
thisy = sound[thissoundhead] * 128 + 128; thissoundhead = (thissoundhead-1+SOUNDCBSIZE)%SOUNDCBSIZE; thisy = sound[ thissoundhead ] * 128 + 128;
thissoundhead = ( thissoundhead - 1 + SOUNDCBSIZE ) % SOUNDCBSIZE;
} }
//puts( sttdebug );
} }
//Extra debugging? // Extra debugging?
if( show_debug && !is_suspended ) if ( show_debug && !is_suspended )
{ {
//Draw the histogram // Draw the histogram
float lasthistval; float lasthistval;
CNFGColor( 0xffffff ); CNFGColor( 0xffffff );
for( i = -1; i < screenx; i++ ) for ( int x_val = -1; x_val < screenx; x_val++ )
{ {
float thishistval = CalcHistAt( (float)i/(float)screenx*freqbins-0.5, nf->freqbins, nf->dists, nf->dists_count ); // Calculate the value of the histogram at the current screen position
if( i >= 0 ) float hist_point = ( float )x_val / ( float )screenx * freqbins - 0.5;
CNFGTackSegment( i, 400-lasthistval * 250.0, i+1, 400-thishistval * 250.0 ); float thishistval =
CalcHistAt( hist_point, nf->freqbins, nf->dists, nf->dists_count );
// Display the value on the screen
const short y = 400 - lasthistval * 250.0;
if ( x_val >= 0 ) CNFGTackSegment( x_val, y, x_val + 1, y );
lasthistval = thishistval; lasthistval = thishistval;
} }
CNFGColor( 0xffffff ); CNFGColor( 0xffffff );
//Draw the bins // Draw the bins
for( i = 0; i < freqs; i++ ) for ( int bin = 0; bin < freqs; i++ )
{ {
float x0 = i / (float)freqs * (float)screenx; float x0 = bin / ( float )freqs * ( float )screenx;
float x1 = (i+1) / (float)freqs * (float)screenx; float x1 = ( bin + 1 ) / ( float )freqs * ( float )screenx;
float amp = nf->outbins[i] * 250.0; float amp = nf->outbins[ bin ] * 250.0;
CNFGDialogColor = CCtoHEX( ((float)i / freqbins), 1.0, 1.0 ); float note = ( float )bin / freqbins;
CNFGDialogColor = CCtoHEX( note, 1.0, 1.0 );
CNFGDrawBox( x0, 0, x1, amp ); CNFGDrawBox( x0, 0, x1, amp );
} }
CNFGDialogColor = 0x0f0f0f; CNFGDialogColor = 0x0f0f0f;
char stdebug[1024]; char stdebug[ 1024 ];
sprintf( stdebug, "DFT:%8.2fms\nFLT:%8.2f\nDEC:%8.2f\nFNL:%8.2f\nDPY:%8.2f", sprintf( stdebug, "DFT:%8.2fms\nFLT:%8.2f\nDEC:%8.2f\nFNL:%8.2f\nDPY:%8.2f",
(nf->DFTTime - nf->StartTime)*1000, ( nf->DFTTime - nf->StartTime ) * 1000, ( nf->FilterTime - nf->DFTTime ) * 1000,
(nf->FilterTime - nf->DFTTime)*1000, ( nf->DecomposeTime - nf->FilterTime ) * 1000,
(nf->DecomposeTime - nf->FilterTime)*1000, ( nf->FinalizeTime - nf->DecomposeTime ) * 1000,
(nf->FinalizeTime - nf->DecomposeTime)*1000, ( VisTimeEnd - VisTimeStart ) * 1000 );
(VisTimeEnd - VisTimeStart)*1000 );
CNFGPenX = 50; CNFGPenX = 50;
CNFGPenY = 50; CNFGPenY = 50;
CNFGDrawText( stdebug, 2 ); CNFGDrawText( stdebug, 2 );
} }
if( !is_suspended ) if ( !is_suspended )
{ {
CNFGColor( show_debug?0xffffff:0x000000 ); CNFGColor( show_debug ? 0xffffff : 0x000000 );
CNFGPenX = 0; CNFGPenY = screeny-10; CNFGPenX = 0;
CNFGPenY = screeny - 10;
CNFGDrawText( "Extra Debug (D)", 2 ); CNFGDrawText( "Extra Debug (D)", 2 );
CNFGColor( show_debug_basic?0xffffff:0x000000 ); CNFGColor( show_debug_basic ? 0xffffff : 0x000000 );
CNFGPenX = 120; CNFGPenY = screeny-10; CNFGPenX = 120;
CNFGPenY = screeny - 10;
CNFGDrawText( "Basic Debug (E)", 2 ); CNFGDrawText( "Basic Debug (E)", 2 );
CNFGColor( show_debug_basic?0xffffff:0x000000 ); CNFGColor( show_debug_basic ? 0xffffff : 0x000000 );
CNFGPenX = 240; CNFGPenY = screeny-10; CNFGPenX = 240;
CNFGPenY = screeny - 10;
sprintf( stt, "[9] Key: %d [0] (%3.1f) [-]", gKey, nf->base_hz ); sprintf( stt, "[9] Key: %d [0] (%3.1f) [-]", gKey, nf->base_hz );
CNFGDrawText( stt, 2 ); CNFGDrawText( stt, 2 );
CNFGColor( 0xffffff ); CNFGColor( 0xffffff );
CNFGPenX = 440; CNFGPenY = screeny-10; CNFGPenX = 440;
CNFGPenY = screeny - 10;
sprintf( stt, "FPS: %d", lastfps ); sprintf( stt, "FPS: %d", lastfps );
CNFGDrawText( stt, 2 ); CNFGDrawText( stt, 2 );
#ifdef ANDROID #ifdef ANDROID
CNFGColor( 0xffffff ); CNFGColor( 0xffffff );
CNFGPenX = 10; CNFGPenY = 600; CNFGPenX = 10;
CNFGPenY = 600;
CNFGDrawText( genlog, 3 ); CNFGDrawText( genlog, 3 );
#endif #endif
CNFGSwapBuffers(); CNFGSwapBuffers();
} }
} }
//Finish Rawdraw with FPS counter, and a nice delay loop. // Finish Rawdraw with FPS counter, and a nice delay loop.
frames++; frames++;
ThisTime = OGGetAbsoluteTime(); ThisTime = OGGetAbsoluteTime();
if( ThisTime > LastFPSTime + 1 && showfps ) if ( ThisTime > LastFPSTime + 1 && showfps )
{ {
#ifndef ANDROID #ifndef ANDROID
printf( "FPS: %d\n", frames ); printf( "FPS: %d\n", frames );
#endif #endif
lastfps = frames; lastfps = frames;
frames = 0; frames = 0;
LastFPSTime+=1; LastFPSTime += 1;
} }
if( cpu_autolimit ) if ( cpu_autolimit )
{ {
SecToWait = cpu_autolimit_interval - ( ThisTime - LastFrameTime ); SecToWait = cpu_autolimit_interval - ( ThisTime - LastFrameTime );
LastFrameTime += cpu_autolimit_interval; LastFrameTime += cpu_autolimit_interval;
if( SecToWait < -.1 ) LastFrameTime = ThisTime - .1; if ( SecToWait < -.1 ) LastFrameTime = ThisTime - .1;
if( SecToWait > 0 ) if ( SecToWait > 0 ) OGUSleep( ( int )( SecToWait * 1000000 ) );
OGUSleep( (int)( SecToWait * 1000000 ) );
} }
if( !is_suspended ) if ( !is_suspended ) SetEnvValues( 0 );
SetEnvValues( 0 );
Last = Now; Last = Now;
} }
} }