source: tests/src/spectral/test-phasevoc-jack.c @ c101fe1

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since c101fe1 was 6938a20, checked in by Paul Brossier <piem@piem.org>, 11 years ago

tests/src/spectral/: improve examples

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/** Test for phase vocoder in jack
2 *
3 * This program should start correctly, when jackd is started or when
4 * using JACK_START_SERVER=true and reconstruct each audio input channel
5 * on the corresponding output channel with some strange effects and a
6 * delay equal to the hop size (hop_s).
7 *
8 */
9
10#include <stdio.h>
11#include <unistd.h>  /* sleep() */
12#include <aubio.h>
13#ifdef HAVE_JACK
14#include "jackio.h"
15#endif /* HAVE_JACK */
16
17uint_t testing  = 0;  // change this to 1 to listen
18
19uint_t win_s    = 512; // window size
20uint_t hop_s    = 128; // hop size
21uint_t channels = 2; // number of audio channels
22uint_t midiin   = 4; // number of midi input channels
23uint_t midiout  = 2; // number of midi output channels
24uint_t pos      = 0; // frames%dspblocksize for jack loop
25
26fvec_t * in[2];
27cvec_t * fftgrain[2];
28fvec_t * out[2];
29
30aubio_pvoc_t * pv[2];
31
32int aubio_process(float **input, float **output, int nframes);
33
34int main ()
35{
36  /* allocate some memory */
37  uint_t i;
38  for (i=0;i<channels;i++) {
39    in[i]       = new_fvec (hop_s); /* input buffer       */
40    fftgrain[i] = new_cvec (win_s); /* fft norm and phase */
41    out[i]      = new_fvec (hop_s); /* output buffer      */
42    /* allocate fft and other memory space */
43    pv[i] = new_aubio_pvoc(win_s,hop_s);
44  }
45
46#ifdef HAVE_JACK
47  aubio_jack_t * jack_setup;
48  jack_setup  = new_aubio_jack(channels, channels, 
49      midiin, midiout,
50      (aubio_process_func_t)aubio_process);
51  aubio_jack_activate(jack_setup);
52  /* stay in main jack loop for 1 seconds only */
53  do {
54    sleep(1);
55  } while(testing);
56  aubio_jack_close(jack_setup);
57#else
58  fprintf(stderr, "WARNING: no jack support\n");
59#endif
60
61  for (i=0;i<channels;i++) {
62    del_aubio_pvoc(pv[i]);
63    del_cvec(fftgrain[i]);
64    del_fvec(in[i]);
65    del_fvec(out[i]);
66  }
67  aubio_cleanup();
68  return 0;
69}
70
71int aubio_process(float **input, float **output, int nframes) {
72  uint_t i;       /*channels*/
73  uint_t j;       /*frames*/
74  for (j=0;j<(unsigned)nframes;j++) {
75    for (i=0;i<channels;i++) {
76      /* write input to datanew */
77      fvec_write_sample(in[i], input[i][j], pos);
78      /* put synthnew in output */
79      output[i][j] = fvec_read_sample(out[i], pos);
80    }
81    /*time for fft*/
82    if (pos == hop_s-1) {
83      /* block loop */
84      for (i=0;i<channels;i++) {
85        aubio_pvoc_do (pv[i], in[i], fftgrain[i]);
86        // zero phases of first channel
87        for (i=0;i<fftgrain[i]->length;i++) fftgrain[0]->phas[i] = 0.; 
88        // double phases of second channel
89        for (i=0;i<fftgrain[i]->length;i++) {
90          fftgrain[1]->phas[i] = 
91            aubio_unwrap2pi (fftgrain[1]->phas[i] * 2.); 
92        }
93        // copy second channel to third one
94        aubio_pvoc_rdo(pv[i], fftgrain[i], out[i]);
95        pos = -1;
96      }
97    }
98    pos++;
99  }
100  return 0;
101}
Note: See TracBrowser for help on using the repository browser.