forked from CPJKU/madmom
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOnsetDetector
executable file
·103 lines (78 loc) · 3.25 KB
/
OnsetDetector
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
#!/usr/bin/env python
# encoding: utf-8
"""
OnsetDetector onset detection algorithm.
"""
from __future__ import absolute_import, division, print_function
import argparse
from madmom.processors import IOProcessor, io_arguments
from madmom.audio.signal import SignalProcessor
from madmom.features import ActivationsProcessor
from madmom.features.onsets import RNNOnsetProcessor, OnsetPeakPickingProcessor
def main():
"""OnsetDetector"""
# define parser
p = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter, description='''
The OnsetDetector program detects all onsets in an audio file with a
recurrent neural network similar to method described in:
"Universal Onset Detection with bidirectional Long Short-Term Memory Neural
Networks"
Florian Eyben, Sebastian Böck, Björn Schuller and Alex Graves.
Proceedings of the 11th International Society for Music Information
Retrieval Conference (ISMIR), 2010.
Instead of 'LSTM' units, this version uses 'tanh' units and a simplified
peak picking method.
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.
$ OnsetDetector 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.
$ OnsetDetector 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='OnsetDetector.2016')
# input/output options
io_arguments(p, output_suffix='.onsets.txt')
ActivationsProcessor.add_arguments(p)
# signal processing arguments
SignalProcessor.add_arguments(p, norm=False, gain=0)
# peak picking arguments
OnsetPeakPickingProcessor.add_arguments(p, threshold=0.35, smooth=0.07)
# parse arguments
args = p.parse_args()
# set immutable defaults
args.fps = 100
args.pre_max = 1. / args.fps
args.post_max = 1. / args.fps
# 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:
# use a RNN to predict the onsets
in_processor = RNNOnsetProcessor(**vars(args))
# output processor
if args.save:
# save the RNN onset activations to file
out_processor = ActivationsProcessor(mode='w', **vars(args))
else:
# perform peak picking on the onset activations
peak_picking = OnsetPeakPickingProcessor(**vars(args))
# output handler
from madmom.utils import write_events as writer
# sequentially process them
out_processor = [peak_picking, writer]
# create an IOProcessor
processor = IOProcessor(in_processor, out_processor)
# and call the processing function
args.func(processor, **vars(args))
if __name__ == '__main__':
main()