forked from CPJKU/madmom
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TCNTempoDetector
executable file
·107 lines (82 loc) · 3.31 KB
/
TCNTempoDetector
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
#!/usr/bin/env python
# encoding: utf-8
"""
TCNTempoDetector beat tracking algorithm.
"""
from __future__ import absolute_import, division, print_function
import argparse
import numpy as np
from madmom.audio import SignalProcessor
from madmom.features import ActivationsProcessor
from madmom.features.beats import TCNBeatProcessor
from madmom.features.tempo import TCNTempoHistogramProcessor, TempoEstimationProcessor
from madmom.io import write_events, write_tempo
from madmom.processors import IOProcessor, io_arguments
def main():
"""TCNTempoDetector"""
# define parser
p = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter, description='''
The TCNTempoDetector program detects the tempo in an audio file according
to the method described in:
"Multi-Task learning of tempo and beat: learning one to improve the other"
Sebastian Böck, Matthew Davies and Peter Knees.
Proc. of the 20th International Society for Music Information Retrieval
Conference (ISMIR), 2019.
This program can be run in 'single' file mode to process a single audio
file and write the detected beats to STDOUT or the given output file.
$ TCNTempoDetector single INFILE [-o OUTFILE]
If multiple audio files should be processed, the program can also be run
in 'batch' mode to save the detected beats to files with the given suffix.
$ TCNTempoDetector batch [-o OUTPUT_DIR] [-s OUTPUT_SUFFIX] FILES
If no output directory is given, the program writes the files with the
detected beats 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='TCNTempoDetector')
# input/output options
io_arguments(p, output_suffix='.bpm.txt', online=True)
ActivationsProcessor.add_arguments(p)
# signal processing arguments
SignalProcessor.add_arguments(p, norm=False, gain=0)
# tempo arguments
TempoEstimationProcessor.add_arguments(p, hist_smooth=15)
# parse arguments
args = p.parse_args()
# set immutable arguments
args.tasks = (1, )
args.interpolate = True
args.method = None
args.act_smooth = None
# 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 TCN to predict beats and tempo
in_processor = TCNBeatProcessor(**vars(args))
# output processor
if args.save:
# save the TCN activations to file
out_processor = ActivationsProcessor(mode='w', **vars(args))
else:
# extract the tempo histogram from the NN output
args.histogram_processor = TCNTempoHistogramProcessor(**vars(args))
# estimate tempo
tempo_estimator = TempoEstimationProcessor(**vars(args))
# output handler
output = write_tempo
# sequentially process them
out_processor = [tempo_estimator, output]
# create an IOProcessor
processor = IOProcessor(in_processor, out_processor)
# and call the processing function
args.func(processor, **vars(args))
if __name__ == '__main__':
main()