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