forked from ibsh/libKeyFinder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathREADME
executable file
·56 lines (41 loc) · 1.95 KB
/
README
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
libKeyFinder can be used to estimate the musical key of digital recordings.
It is the basis of the KeyFinder GUI app, which is available as a binary download for Mac OSX and Windows at www.ibrahimshaath.co.uk/keyfinder
For the most basic use case, do something like this:
// Static because it retains useful resources for repeat use
static KeyFinder::KeyFinder k;
// Build an empty audio object
KeyFinder::AudioData a;
// Prepare the object for your audio stream
a.setFrameRate(yourAudioStream.framerate);
a.setChannels(yourAudioStream.channels);
a.addToSampleCount(yourAudioStream.length);
// Copy your audio into the object
while (int i = 0; i < yourAudioStream.length; i++) {
a.setSample(i, yourAudioStream[i]);
}
// Run the analysis
KeyFinder::KeyDetectionResult r = k.keyOfAudio(a);
// And do something with the result!
doSomethingWith(r.globalKeyEstimate);
Alternatively, you can transform a stream of audio into a chromatic representation, and make progressive estimates of the key:
KeyFinder::AudioData a;
a.setFrameRate(yourAudioStream.framerate);
a.setChannels(yourAudioStream.channels);
a.addToSampleCount(yourAudioStream.packetLength);
static KeyFinder::KeyFinder k;
// the workspace holds the memory allocations for analysis of a single track
KeyFinder::Workspace w;
while (yourPacket = newAudioPacket()) {
while (int i = 0; i < newAudioPacket.length; i++) {
a.setSample(i, newAudioPacket[i]);
}
k.progressiveChromagram(a, w);
// if you want to grab progressive key estimates...
KeyFinder::KeyDetectionResult r = k.keyOfChromagram(w);
doSomethingWithMostRecentKeyEstimate(r.globalKeyEstimate);
}
// if you want to squeeze every last bit of audio from the working buffer...
k.finalChromagram(w)
// and finally...
KeyFinder::KeyDetectionResult r = k.keyOfChromagram(w);
doSomethingWithFinalKeyEstimate(r.globalKeyEstimate);