ok so i'm not exactly sure how to describe this problem as i'm new to Audio analysis as a whole so i'm going to explain it step by step.
- So i have this algorithm here written in csharp
// Put into groups
for (int i = 0; i < onsets.Count-1; i ){
for (float i2 = 1f; i2 < range 1; i2 ){
if (onsets[i] >= rangemult*(i2-1f) && onsets[i] <= rangemult*i2){
sorted.Add(((rangemult*i2)*2f)*10f);
}
}
}
- Here's what it does:
onsets --> a List containing the onsets found (excluding any 0's)
range --> Song Sample Depth (1024)
rangemult --> Is the maximum value in the list of onsets (so onsets.Max())
divided by the range
so (max DIV range)
sorted --> list the sorted onsets are added to
(rangemult*i2)*2f)*10f
--> i do this in order to get the value to be a whole number (which doesn't happen most of the time but it's really just for a sake of neatness - so for the most part it can be ignored)
in principle this algorithm would convert an array (0.1, 0.2, 0.4, 0.45, 0.5
) with
range = 10
to 2, 4, 8, 9, 10
range = 20
to 4, 8, 16, 18, 20
etc...
- so given this why is it that when
1024
is set asrange
the maximum value insorted
is always20
?
Additional info:
- i'm using a lomont FFT
- 1024 is constant throughout the onset detection algo
- treat
onsets.max()
as always1
(i'm yet to find an instance whereonsets.Max()
is not 1)
I greatly appreciate it if you can provide even the smallest hint as to what's wrong - if there is not enough information here or the information is uneeded please inform me as i'm still new so i have hard time trying to explain my questions in an accurate manner - thankyou for understanding :)
CodePudding user response:
Given your apparent purpose, all you need is a simple LINQ statement:
var rangemult = range/onsets.Max();
var sorted = onsets.Select(onset => onset*rangemult).ToList();
However, this doesn't round the result to integers. You can add any desired rounding such as Math.Floor
or Math.Round
or Math.Ceil
in the Select
:
var sorted = onsets.Select(onset => Math.Round(onset*rangemult)).ToList();