Hurra! Zagadka #9 Zagadka z wizualizacji z odcinka 2 rozwiązana! Zielona Xamarinowa edycja app-ki mruga już tak samo jak oryginał w Javie. Poprawka wbita na githubie.
Co nie grało? Czemu w Javie dokładnie ten sam kod inaczej działał niż w C#? Zrobiłem sobie logowanie tablicy bajtów z FFT dostarczanych do mojej klasy LightOrganProcessor przez obiekt klasy Visualizer z Android API w projekcie w Javie oraz w C#.
Java:
08-03 19:23:35.166 19561-19561/com.apps.kruszyn.lightorganapp I/sample_LightOrganProce: processFftData 1470245015166: [-8, 0, -5, -1, -8, 0, -14, 2, -13, 17, 24, -13, 11, 10, 13, -3, 4, -8, -1, -4, 3, 3, 4, -3, 0, -5, -1, -2, 1, 0, 3, -2, -2, -4, -2, 0, 0, 1, 2, -1, -1, -3, -2, -2, -1, 0, 1, -1, 0, -3, -3, -1, -1, 0, 0, -1, 0, -2, -2, -1, 0, 0, 0, -1, -1, -2, -2, -1, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 1, -1, 0, -2, -1, -1, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, -1, 0, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, 0, -2, -1, -1, 0, 0, 0, -1, -1, -2, -2, -2, -3, 0, -1, 0, -2, 2, 0, 0, 0, 0, 0, 1, 0, -1, -1, 0, 0, 0, 1, -1, 0, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, -2, -3, -2, -2, -3, -1, 1, 0, 1, 0, -1, 0, -2, 0, -1, 0, -1, -1, -1, -2, -1, 0, -1, 0, 0, 0, -1, -1, -1, -1, 0, -2, 0, -1, 0, 0, 0, -1, 2, 0, -5, -2, -2, -2, 0, 0, 1, 0, -1, -1, 0, -2, -1, 1, -1, 1, -1, 0, -2, -2, 1, -1, 0, 1, -1, 2, -2, -1, -3, -2, 0, -1, 0, -1, -2, 1, -3, -2, -1, -3, -2, -1, 2, -1, -2, -3, 0, 2, 0, 0, 1, -1, -1, 0, 0, 1, 0, 1, -2, 0, -2, -2, -1, 0, -4, -2, -2, 0, -3, -2, -1, -4, -1, -2, 1, 0, -1, -1, 0, -1, 0, -1, -1, -1, 1, -3, 2, 0, 2, 3, 0, 0, 0, 0, -1, 0, 1, -1, -2, 1, -3, -2, -2, 1, 0, -1, -1, -2, -2, -2, -1, -2, -1, -2, 1, -2, -1, 1, -1, 0, -1, -1, -1, -2, 0, -1, -2, -1, 0, 1, 0, 0, -2, -3, 0, -2, 0, -1, 0, 0, 0, -1, -2, 0, -3, -1, -3, -3, -1, -2, 0, -1, 1, 0, 1, 1, 0, -2, 1, 0, 1, 0, -1, 0, -2, 0, -1, -4, -3, -2, 1, -1, 1, 0, 2, -2, 1, -1, -1, 0, -2, -2, 0, -1, 0, -1, -1, -1, -1, -2, -1, -2, -1, 0, 0, -1, 0, -1, 0, -4, 0, -1, 1, -1, 2, 0, 1, 0, 0, -1, 0, -1, 1, 0, -1, -1, 0, 0, 0, -1, -1, -3, -1, 0, 2, -1, 1, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, -1, -1, -2, 2, 0, 0, 0, -2, -2, -1, -2, 1, 0, -1, -1, -1, -2, -1, 1, 0, -1, 0, -1, 0, 0, 0, -1, 1, -2, 0, -1, 1, 0, 2, -1, 0, -1, 1, 0, -1, -1, -1, -2, 1, 0, 1, 0, 1, 1, 0, -1, 1, 0, -1, -1, -2, -1, 0, -1, 0, -1, 0, 0, 1, 2, 1, -2, 2, 2, -2, 0, -2, -2, -1, -1, 0, 0, -1, 0, 0, 0, -1, 0, -1, -2, 1, 0, -1, 0, 0, 1, 0, -1, 1, -2, 0, -1, 0, -1, 2, 1, 0, -1, -1, -1, 0, 1, 0, 1, 0, 0, -1, -1, -1, -1, 0, -1, 1, 0, 1, 1, 1, 2, 0, 0, 0, -1, -1, 1, 0, 1, -1, 0, -2, -1, -2, -2, 0, -1, 2, 1, 1, 2, -1, 0, -2, -3, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, -1, 0, -1, 0, 0, -2, -1, -1, 0, 0, 0, -1, 0, -1, 1, 1, 0, 1, 0, 1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, -1, -1, -1, 0, 0, -1, 0, -1, 0, 0, 0, 1, -1, 0, -2, -2, -2, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 1, -1, -2, -2, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, -1, 0, -2, 0, 1, 0, -1, -1, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, 0, -1, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 0]
…
C#:
08-03 19:47:04.625 I/sample_LightOrganProce(22658): processFftData 1470246424618: [2, 0, 0, 251, 249, 1, 1, 15, 19, 14, 241, 215, 12, 242, 254, 241, 250, 249, 253, 0, 2, 249, 0, 252, 255, 254, 1, 255, 2, 254, 2, 255, 0, 250, 254, 253, 0, 254, 0, 254, 0, 253, 255, 253, 255, 254, 255, 254, 255, 255, 0, 255, 0, 255, 0, 254, 255, 254, 255, 255, 0, 255, 0, 254, 0, 254, 255, 254, 255, 255, 255, 254, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 254, 1, 254, 0, 255, 0, 254, 255, 255, 0, 254, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 255, 255, 0, 255, 0, 255, 0, 0, 255, 254, 0, 255, 1, 255, 2, 1, 254, 1, 0, 0, 255, 1, 0, 1, 0, 1, 255, 0, 254, 0, 255, 0, 255, 0, 0, 255, 0, 1, 255, 0, 1, 0, 0, 3, 255, 0, 253, 255, 0, 253, 255, 1, 2, 0, 255, 0, 255, 3, 0, 255, 1, 1, 255, 0, 254, 254, 0, 0, 255, 255, 0, 1, 2, 3, 1, 2, 253, 2, 254, 255, 255, 1, 255, 0, 255, 254, 250, 0, 254, 255, 254, 2, 254, 254, 253, 252, 2, 2, 2, 1, 254, 0, 1, 1, 0, 1, 254, 1, 0, 1, 253, 0, 0, 0, 2, 4, 250, 0, 253, 254, 254, 2, 255, 0, 253, 255, 252, 254, 252, 251, 253, 254, 8, 255, 255, 255, 1, 255, 0, 4, 254, 2, 253, 255, 252, 252, 253, 253, 254, 0, 255, 0, 0, 254, 252, 252, 0, 0, 3, 2, 0, 0, 0, 1, 255, 3, 2, 3, 255, 2, 254, 254, 254, 0, 254, 255, 254, 255, 2, 253, 255, 254, 253, 2, 0, 2, 0, 0, 1, 1, 255, 1, 0, 255, 252, 254, 254, 0, 255, 0, 253, 253, 254, 254, 0, 255, 0, 255, 0, 254, 255, 252, 255, 254, 255, 0, 0, 253, 1, 255, 0, 1, 255, 0, 255, 254, 0, 254, 1, 4, 1, 1, 0, 0, 1, 1, 254, 255, 253, 253, 254, 253, 2, 1, 5, 5, 1, 2, 254, 1, 252, 0, 1, 2, 253, 255, 1, 0, 1, 0, 255, 3, 255, 2, 1, 1, 0, 1, 0, 2, 2, 3, 254, 1, 252, 0, 254, 1, 254, 2, 251, 255, 254, 254, 253, 253, 255, 254, 4, 1, 255, 0, 255, 255, 255, 2, 254, 255, 254, 0, 0, 0, 0, 0, 3, 1, 254, 1, 0, 253, 255, 255, 0, 255, 0, 254, 255, 1, 0, 0, 1, 2, 255, 1, 0, 255, 255, 254, 1, 253, 1, 0, 3, 2, 2, 1, 255, 255, 254, 255, 0, 255, 2, 2, 253, 2, 253, 0, 254, 255, 255, 254, 254, 255, 254, 2, 1, 0, 255, 254, 255, 254, 0, 255, 1, 1, 0, 1, 255, 0, 3, 1, 255, 255, 255, 254, 255, 254, 0, 2, 254, 0, 255, 255, 0, 0, 1, 1, 0, 255, 1, 2, 254, 0, 254, 253, 253, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 254, 0, 0, 0, 255, 0, 253, 0, 2, 3, 255, 254, 1, 253, 1, 0, 0, 1, 1, 1, 1, 255, 255, 255, 0, 1, 1, 0, 2, 255, 0, 253, 255, 254, 255, 0, 255, 255, 0, 255, 255, 255, 0, 255, 0, 254, 1, 2, 0, 254, 254, 0, 0, 0, 255, 1, 2, 1, 2, 255, 0, 253, 254, 253, 253, 255, 255, 1, 1, 0, 2, 254, 1, 253, 253, 0, 2, 255, 0, 254, 255, 1, 0, 1, 1, 0, 1, 255, 1, 254, 0, 254, 255, 255, 255, 2, 1, 1, 3, 255, 255, 254, 254, 255, 255, 0, 1, 255, 0, 253, 255, 255, 0, 2, 1, 2, 1, 255, 2, 254, 0, 0, 0, 255, 1, 255, 253, 254, 254, 255, 255, 0, 1, 1, 2, 255, 0, 253, 0, 253, 255, 255, 255, 254, 0, 255, 0, 254, 254, 0, 1, 254, 255, 255, 0, 0, 0, 254, 255, 255, 253, 1, 254, 1, 0, 1, 1, 0, 0, 255, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255
…
Podczas portowania wkradła się szkolna pułapka (kiedyś na studiach gdy Java rozmawiała z C++ przez sockety stało się podobnie….). Pułapką była zbytnia wierność kodu w C# w stosunku do kodu w Javie, w sumie to mapowanie API w Xamarinie z Javy na C# ma trochę za uszami. Przecież byte w Javie to NIE TO SAMO co byte w C#, po dwakroć, po trzykroć! W Javie byte jest signed, podczas gdy w C# jest unsigned.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
https://msdn.microsoft.com/en-us/library/5bdb6693.aspx
W C# bajtem unsigned jest sbyte.
https://msdn.microsoft.com/en-us/library/d86he86x.aspx
Xamarin zwraca nam z Android API tablicę byte[] zamiast sbyte[]. Jak dokonam rzutowania bajtu w C# (powstałego z bajtu w Javie) na sbyte, to powrócę do tego, co było w Javie.
Po zastosowaniu poprawki:
public class LightOrganProcessor
{
…
public void ProcessFftData(Visualizer visualizer, byte[] fft, int samplingRate)
{
…
//bass
…
while (nextFrequency < LowFrequency)
{
energySum += (int)GetAmplitude((sbyte)fft[k], (sbyte)fft[k + 1]);
k += 2;
nextFrequency = ((k / 2) * sampleRate) / (captureSize);
}
…
//mid
…
while (nextFrequency < MidFreguency)
{
energySum += (int)GetAmplitude((sbyte)fft[k], (sbyte)fft[k + 1]);
k += 2;
nextFrequency = ((k / 2) * sampleRate) / (captureSize);
}
…
//treble
…
while ((nextFrequency < HighFrequency) && (k < fft.Length))
{
energySum += (int)GetAmplitude((sbyte)fft[k], (sbyte)fft[k + 1]);
k += 2;
nextFrequency = ((k / 2) * sampleRate) / (captureSize);
}
…
}
private static double GetAmplitude(sbyte r, sbyte i)
{
return Math.Sqrt(r * r + i * i);
}
…
}
mruganie świateł wraca w Xamarinie do normy