1b815c7f3Sopenharmony_ci/* 2b815c7f3Sopenharmony_ci** Copyright (C) 2007-2012 Erik de Castro Lopo <erikd@mega-nerd.com> 3b815c7f3Sopenharmony_ci** 4b815c7f3Sopenharmony_ci** This program is free software; you can redistribute it and/or modify 5b815c7f3Sopenharmony_ci** it under the terms of the GNU General Public License as published by 6b815c7f3Sopenharmony_ci** the Free Software Foundation; either version 2 of the License, or 7b815c7f3Sopenharmony_ci** (at your option) any later version. 8b815c7f3Sopenharmony_ci** 9b815c7f3Sopenharmony_ci** This program is distributed in the hope that it will be useful, 10b815c7f3Sopenharmony_ci** but WITHOUT ANY WARRANTY; without even the implied warranty of 11b815c7f3Sopenharmony_ci** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12b815c7f3Sopenharmony_ci** GNU General Public License for more details. 13b815c7f3Sopenharmony_ci** 14b815c7f3Sopenharmony_ci** You should have received a copy of the GNU General Public License 15b815c7f3Sopenharmony_ci** along with this program; if not, write to the Free Software 16b815c7f3Sopenharmony_ci** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17b815c7f3Sopenharmony_ci*/ 18b815c7f3Sopenharmony_ci 19b815c7f3Sopenharmony_ci#include "sfconfig.h" 20b815c7f3Sopenharmony_ci 21b815c7f3Sopenharmony_ci#include <stdio.h> 22b815c7f3Sopenharmony_ci#include <stdlib.h> 23b815c7f3Sopenharmony_ci#include <string.h> 24b815c7f3Sopenharmony_ci#include <math.h> 25b815c7f3Sopenharmony_ci 26b815c7f3Sopenharmony_ci#include <sndfile.h> 27b815c7f3Sopenharmony_ci 28b815c7f3Sopenharmony_ci#include "utils.h" 29b815c7f3Sopenharmony_ci#include "generate.h" 30b815c7f3Sopenharmony_ci 31b815c7f3Sopenharmony_ci#define SF_MAX(x, y) ((x) > (y) ? (x) : (y)) 32b815c7f3Sopenharmony_ci 33b815c7f3Sopenharmony_cistatic float crappy_snare (float *output, int len, int offset, float gain, float maxabs) ; 34b815c7f3Sopenharmony_ci 35b815c7f3Sopenharmony_civoid 36b815c7f3Sopenharmony_cigenerate_file (const char * filename, int format, int len) 37b815c7f3Sopenharmony_ci{ float * output ; 38b815c7f3Sopenharmony_ci float maxabs = 0.0 ; 39b815c7f3Sopenharmony_ci 40b815c7f3Sopenharmony_ci output = calloc (len, sizeof (float)) ; 41b815c7f3Sopenharmony_ci 42b815c7f3Sopenharmony_ci maxabs = crappy_snare (output, len, 0, 0.95f, maxabs) ; 43b815c7f3Sopenharmony_ci maxabs = crappy_snare (output, len, len / 4, 0.85f, maxabs) ; 44b815c7f3Sopenharmony_ci maxabs = crappy_snare (output, len, 2 * len / 4, 0.85f, maxabs) ; 45b815c7f3Sopenharmony_ci crappy_snare (output, len, 3 * len / 4, 0.85f, maxabs) ; 46b815c7f3Sopenharmony_ci 47b815c7f3Sopenharmony_ci write_mono_file (filename, format, 44100, output, len) ; 48b815c7f3Sopenharmony_ci 49b815c7f3Sopenharmony_ci free (output) ; 50b815c7f3Sopenharmony_ci} /* generate_file */ 51b815c7f3Sopenharmony_ci 52b815c7f3Sopenharmony_cistatic inline float 53b815c7f3Sopenharmony_cirand_float (void) 54b815c7f3Sopenharmony_ci{ return rand () / (0.5f * (float) RAND_MAX) - 1.0f ; 55b815c7f3Sopenharmony_ci} /* rand_float */ 56b815c7f3Sopenharmony_ci 57b815c7f3Sopenharmony_cistatic float 58b815c7f3Sopenharmony_cicrappy_snare (float *output, int len, int offset, float gain, float maxabs) 59b815c7f3Sopenharmony_ci{ int k ; 60b815c7f3Sopenharmony_ci float env = 0.0f ; 61b815c7f3Sopenharmony_ci 62b815c7f3Sopenharmony_ci for (k = offset ; k < len && env < gain ; k++) 63b815c7f3Sopenharmony_ci { env += 0.03f ; 64b815c7f3Sopenharmony_ci output [k] += env * rand_float () ; 65b815c7f3Sopenharmony_ci maxabs = SF_MAX (maxabs, fabsf (output [k])) ; 66b815c7f3Sopenharmony_ci } ; 67b815c7f3Sopenharmony_ci 68b815c7f3Sopenharmony_ci for ( ; k < len && env > 1e-8 ; k++) 69b815c7f3Sopenharmony_ci { env *= 0.995f ; 70b815c7f3Sopenharmony_ci output [k] += env * rand_float () ; 71b815c7f3Sopenharmony_ci maxabs = SF_MAX (maxabs, fabsf (output [k])) ; 72b815c7f3Sopenharmony_ci } ; 73b815c7f3Sopenharmony_ci 74b815c7f3Sopenharmony_ci return maxabs ; 75b815c7f3Sopenharmony_ci} /* crappy_snare */ 76