1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/* Rhythm estimation in real time
Copyright (C) 2000 Jarno Seppänen and Piotr Majdak
$Id: rhythm_ioi_histogram.h,v 1.1 2002-11-19 11:39:55 ggeiger Exp $
This file is part of rhythm_estimator.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef __RHYTHM_IOI_HISTOGRAM_H__
#define __RHYTHM_IOI_HISTOGRAM_H__
/* Global header for Rhythm Estimator */
#include "rhythm_estimator.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Local Parameter default values */
#define RHYTHM_IOI_HISTOGRAM_DEFAULT_HIST_HALF_LIFE 1300 /* ms */
#define RHYTHM_IOI_HISTOGRAM_DEFAULT_HIST_CYCLES 4
#define RHYTHM_IOI_HISTOGRAM_HIST_HALF_LIFE_MIN 10 /*ms*/
#define RHYTHM_IOI_HISTOGRAM_HIST_CYCLES_MIN 1
#define RHYTHM_IOI_HISTOGRAM_HIST_HALF_LIFE_MAX 10000 /* ms*/
#define RHYTHM_IOI_HISTOGRAM_HIST_CYCLES_MAX 16
#define RHYTHM_IOI_HISTOGRAM_IOI_FIFO_LENGTH 500 /* onsets */
typedef struct
{
/* User-changeable parameters: */
float ioi_resolution; /* ms */
float min_quantum; /* ms */
float max_quantum; /* ms */
float hist_cycles;
float hist_half_life; /* ms */
/* --- Private data --- */
/* Internal "helper" variables */
unsigned hist_length;
float hist_new_coef; /* Coefficient for histogram update */
/* Onsets are stored in the following FIFO */
float* fifo_buffer; /* FIFO address */
unsigned fifo_num_onsets; /* number of onsets contained in FIFO */
unsigned fifo_length; /* FIFO length, i.e. maximum num_onsets */
unsigned fifo_current_index; /* Ringbuffer read/write index;
points to the oldest value */
/* IOI histograms are stored in the following buffers */
float* fill_ioi_histogram; /* Buffer length is given with hist_length */
float* main_ioi_histogram; /* Buffer length is given with hist_length */
int fill_histogram_changed;
double main_histogram_update_time;
} Rhythm_Ioi_Histogram;
Rhythm_Ioi_Histogram* rhythm_ioi_histogram_new (void);
void rhythm_ioi_histogram_delete (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
void rhythm_ioi_histogram_initialize (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
void rhythm_ioi_histogram_finish (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
int rhythm_ioi_histogram_onset_event (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, double time);
void rhythm_ioi_histogram_periodic_event (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, double time);
float rhythm_ioi_histogram_get_ioi_resolution (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
float rhythm_ioi_histogram_get_min_quantum (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
float rhythm_ioi_histogram_get_max_quantum (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
float rhythm_ioi_histogram_get_hist_cycles (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
float rhythm_ioi_histogram_get_hist_half_life (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
float rhythm_ioi_histogram_get_phase_adap_speed (Rhythm_Ioi_Histogram* rhythm_ioi_histogram);
void rhythm_ioi_histogram_set_ioi_resolution (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, float v);
void rhythm_ioi_histogram_set_min_quantum (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, float v);
void rhythm_ioi_histogram_set_max_quantum (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, float v);
void rhythm_ioi_histogram_set_hist_cycles (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, float v);
void rhythm_ioi_histogram_set_hist_half_life (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, float v);
void rhythm_ioi_histogram_set_phase_adap_speed (Rhythm_Ioi_Histogram* rhythm_ioi_histogram, float v);
/* Subroutines */
static void rhythm_ioi_histogram_update_ioi_histogram (Rhythm_Ioi_Histogram* ge, double time_passed);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __RHYTHM_IOI_HISTOGRAM_H__ */
/* EOF */
|