Chris@0: /* Chris@0: ** Copyright (C) 2007-2011 Erik de Castro Lopo Chris@0: ** Chris@0: ** This program is free software; you can redistribute it and/or modify Chris@0: ** it under the terms of the GNU General Public License as published by Chris@0: ** the Free Software Foundation; either version 2 of the License, or Chris@0: ** (at your option) any later version. Chris@0: ** Chris@0: ** This program is distributed in the hope that it will be useful, Chris@0: ** but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: ** GNU General Public License for more details. Chris@0: ** Chris@0: ** You should have received a copy of the GNU General Public License Chris@0: ** along with this program; if not, write to the Free Software Chris@0: ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Chris@0: */ Chris@0: Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: Chris@0: #include Chris@0: Chris@0: #include "utils.h" Chris@0: #include "generate.h" Chris@0: Chris@0: #define SF_MAX(x,y) ((x) > (y) ? (x) : (y)) Chris@0: Chris@0: static float crappy_snare (float *output, int len, int offset, float gain, float maxabs) ; Chris@0: Chris@0: void Chris@0: generate_file (const char * filename, int format, int len) Chris@0: { float * output ; Chris@0: float maxabs = 0.0 ; Chris@0: Chris@0: output = calloc (len, sizeof (float)) ; Chris@0: Chris@0: maxabs = crappy_snare (output, len, 0, 0.95, maxabs) ; Chris@0: maxabs = crappy_snare (output, len, len / 4, 0.85, maxabs) ; Chris@0: maxabs = crappy_snare (output, len, 2 * len / 4, 0.85, maxabs) ; Chris@0: crappy_snare (output, len, 3 * len / 4, 0.85, maxabs) ; Chris@0: Chris@0: write_mono_file (filename, format, 44100, output, len) ; Chris@0: Chris@0: free (output) ; Chris@0: } /* generate_file */ Chris@0: Chris@0: static inline float Chris@0: rand_float (void) Chris@0: { return rand () / (0.5 * RAND_MAX) - 1.0 ; Chris@0: } /* rand_float */ Chris@0: Chris@0: static float Chris@0: crappy_snare (float *output, int len, int offset, float gain, float maxabs) Chris@0: { int k ; Chris@0: float env = 0.0 ; Chris@0: Chris@0: for (k = offset ; k < len && env < gain ; k++) Chris@0: { env += 0.03 ; Chris@0: output [k] += env * rand_float () ; Chris@0: maxabs = SF_MAX (maxabs, fabs (output [k])) ; Chris@0: } ; Chris@0: Chris@0: for ( ; k < len && env > 1e-8 ; k++) Chris@0: { env *= 0.995 ; Chris@0: output [k] += env * rand_float () ; Chris@0: maxabs = SF_MAX (maxabs, fabs (output [k])) ; Chris@0: } ; Chris@0: Chris@0: return maxabs ; Chris@0: } /* crappy_snare */