forked from CPJKU/madmom
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SuperFlux
executable file
·106 lines (83 loc) · 3.72 KB
/
SuperFlux
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
#!/usr/bin/env python
# encoding: utf-8
"""
SuperFlux onset detection algorithm.
"""
from __future__ import absolute_import, division, print_function
import argparse
from madmom.audio import (FramedSignalProcessor,
LogarithmicSpectrogramProcessor, SignalProcessor,
SpectrogramDifferenceProcessor)
from madmom.audio.filters import FilterbankProcessor, LogarithmicFilterbank
from madmom.features import (ActivationsProcessor, OnsetPeakPickingProcessor,
SpectralOnsetProcessor)
from madmom.io import write_onsets
from madmom.processors import IOProcessor, io_arguments
def main():
"""SuperFlux"""
# define parser
p = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter, description='''
The SuperFlux program detects all onsets in an audio file according to the
algorithm described in:
"Maximum Filter Vibrato Suppression for Onset Detection"
Sebastian Böck and Gerhard Widmer.
Proceedings of the 16th International Conference on Digital Audio Effects
(DAFx), 2013.
This program can be run in 'single' file mode to process a single audio
file and write the detected onsets to STDOUT or the given output file.
$ SuperFlux single INFILE [-o OUTFILE]
If multiple audio files should be processed, the program can also be run
in 'batch' mode to save the detected onsets to files with the given suffix.
$ SuperFlux batch [-o OUTPUT_DIR] [-s OUTPUT_SUFFIX] FILES
If no output directory is given, the program writes the files with the
detected onsets to the same location as the audio files.
The 'pickle' mode can be used to store the used parameters to be able to
exactly reproduce experiments.
''')
# version
p.add_argument('--version', action='version', version='SuperFlux.2016')
# add arguments
io_arguments(p, output_suffix='.onsets.txt')
ActivationsProcessor.add_arguments(p)
SignalProcessor.add_arguments(p, norm=False, gain=0)
FramedSignalProcessor.add_arguments(p, fps=200)
FilterbankProcessor.add_arguments(p, num_bands=24, fmin=30, fmax=17000,
norm_filters=False)
LogarithmicSpectrogramProcessor.add_arguments(p, log=True, mul=1, add=1)
SpectrogramDifferenceProcessor.add_arguments(p, diff_ratio=0.5,
diff_max_bins=3,
positive_diffs=True)
OnsetPeakPickingProcessor.add_arguments(p, threshold=1.1, pre_max=0.01,
post_max=0.05, pre_avg=0.15,
post_avg=0, combine=0.03, delay=0)
# parse arguments
args = p.parse_args()
# set immutable defaults
args.num_channels = 1
args.onset_method = 'superflux'
args.filterbank = LogarithmicFilterbank
# print arguments
if args.verbose:
print(args)
# input processor
if args.load:
# load the activations from file
in_processor = ActivationsProcessor(mode='r', **vars(args))
else:
# define spectral onset detection function
in_processor = SpectralOnsetProcessor(**vars(args))
# output processor
if args.save:
# save the onset activations to file
out_processor = ActivationsProcessor(mode='w', **vars(args))
else:
# detect the onsets and output them
peak_picking = OnsetPeakPickingProcessor(**vars(args))
out_processor = [peak_picking, write_onsets]
# create an IOProcessor
processor = IOProcessor(in_processor, out_processor)
# and call the processing function
args.func(processor, **vars(args))
if __name__ == '__main__':
main()