URL
https://opencores.org/ocsvn/sqmusic/sqmusic/trunk
Subversion Repositories sqmusic
Compare Revisions
- This comparison shows the changes necessary to convert path
/sqmusic/trunk/cpp
- from Rev 17 to Rev 18
- ↔ Reverse comparison
Rev 17 → Rev 18
/args.h
47,12 → 47,20
argument_t* def_arg; |
std::string program_name; |
argument_t help_arg; |
void clean_args() { |
for( int j=0; j<legal_args.size(); j++ ) { |
argument_t& a = *legal_args[j]; |
if( a.short_name=="-h" && a.long_name!="help" ) |
{ help_arg.short_name.clear(); break; } // remove -h for help if already used |
} |
} |
void throw_error( std::string x ) /*throw const char**/ { throw x.c_str(); } |
public: |
void throw_error( std::string x ) /*throw const char**/ { throw x.c_str(); } |
Args( int argc, char *argv[], arg_vector_t& legal_args ) //throw const char * |
: legal_args( legal_args ), |
help_arg( legal_args, "help", argument_t::flag, "Display usage information") |
{ |
{ |
clean_args(); // eliminate duplicated values |
// look for default argument |
def_arg=NULL; |
for( int j=0; j<legal_args.size(); j++ ) { |
132,7 → 140,7
std::cout << "\t"; |
std::string aux; |
if( !a.long_name.empty() ) aux = a.long_name; |
if( !a.long_name.empty() && !a.long_name.empty() ) aux += " | "; |
if( !a.long_name.empty() && !a.short_name.empty() ) aux += " | "; |
if( !a.short_name.empty() ) aux+= a.short_name; |
std::cout << brackets( a, aux ); |
switch( a.type ) { |
/sintable.cc
0,0 → 1,121
/* |
sintable: sine wave table generator |
Based on MAME's fm.c file. |
|
(c) Jose Tejada Gomez, May 2013 |
You can use this file following the GNU GENERAL PUBLIC LICENSE version 3 |
Read the details of the license in: |
http://www.gnu.org/licenses/gpl.txt |
|
Send comments to: jose.tejada at ieee.org |
|
*/ |
|
#include <iostream> |
#include <cmath> |
#include "../cpp/args.h" |
|
using namespace std; |
|
#define ENV_BITS 10 |
#define ENV_LEN (1<<ENV_BITS) |
#define ENV_STEP (128.0/ENV_LEN) |
#define TL_RES_LEN (256) /* 8 bits addressing (real chip) */ |
#define SIN_BITS 10 |
#define SIN_LEN (1<<SIN_BITS) |
#define SIN_MASK (SIN_LEN-1) |
|
signed int tl_tab[TL_RES_LEN]; |
unsigned int sin_tab[SIN_LEN]; |
|
void init_tables(void) // copied from fm.c |
{ |
signed int i,x; |
signed int n; |
double o,m; |
|
for (x=0; x<TL_RES_LEN; x++) |
{ |
m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0); |
m = floor(m); |
|
/* we never reach (1<<16) here due to the (x+1) */ |
/* result fits within 16 bits at maximum */ |
|
n = (int)m; /* 16 bits here */ |
n >>= 4; /* 12 bits here */ |
if (n&1) /* round to nearest */ |
n = (n>>1)+1; |
else |
n = n>>1; |
/* 11 bits here (rounded) */ |
n <<= 2; /* 13 bits here (as in real chip) */ |
tl_tab[ x ] = n; |
} |
|
for (i=0; i<SIN_LEN; i++) |
{ |
/* non-standard sinus */ |
m = sin( ((i*2)+1) * M_PI / SIN_LEN ); /* checked against the real chip */ |
|
/* we never reach zero here due to ((i*2)+1) */ |
if (m>0.0) |
o = 8*log(1.0/m)/log(2.0); /* convert to 'decibels' */ |
else |
o = 8*log(-1.0/m)/log(2.0); /* convert to 'decibels' */ |
|
o = o / (ENV_STEP/4); |
|
n = (int)(2.0*o); |
if (n&1) /* round to nearest */ |
n = (n>>1)+1; |
else |
n = n>>1; |
|
sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 ); |
/*logerror("FM.C: sin [%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[i],tl_tab[sin_tab[i]]);*/ |
} |
} |
|
void dump_tl_tab() { |
for( int i=0; i<TL_RES_LEN; i++ ) { |
cout << tl_tab[i] << "\n"; |
} |
} |
|
void dump_sin_tab() { |
for( int i=0; i<SIN_LEN; i++ ) { |
cout << sin_tab[i] << "\n"; |
} |
} |
|
void dump_composite() { |
// cout.setf( ios::hex, ios::basefield ); |
for( int i=0; i<SIN_LEN; i++ ) { |
cout << sin_tab[i] << "," << tl_tab[ sin_tab[i] ] << "\n"; |
} |
} |
|
unsigned conv( double x ) { |
double xmax = 0xFFFFF; // 20 bits, all ones |
return (unsigned)(xmax* 20*log(x+0.5)); |
} |
|
int main(int argc, char *argv[]) { |
arg_vector_t legal_args; |
argument_t arg_hex( legal_args, "hex", argument_t::flag, |
"set output to hexadecimal mode" ); |
argument_t arg_sin( legal_args, "sin", argument_t::flag, |
"dump sine wave" ); |
argument_t arg_pow( legal_args, "pow", argument_t::flag, |
"dump power table" ); |
Args args_parser( argc, argv, legal_args ); |
if( args_parser.help_request() ) { return 0; } |
if( argc==1 ) { args_parser.show_help(); return 0; } |
init_tables(); |
//dump_composite(); |
if( arg_hex.is_set() ) cout.setf( ios::hex, ios::basefield ); |
if( arg_pow.is_set() ) dump_tl_tab(); |
if( arg_sin.is_set() ) dump_sin_tab(); |
return 0; |
} |