From 98d9fa24cf22ae03b584fb186fc166af5358119f Mon Sep 17 00:00:00 2001 From: Overside srl Date: Wed, 4 Nov 2026 14:13:04 +0100 Subject: [PATCH] new analyzer --- bin/LoopbackCapture.cs | 545 ++++++++++++++++++++++++++- bin/LoopbackCapture.exe | Bin 13312 -> 28160 bytes bin/build.ps1 | 10 + project.godot | 1 + scenes/Main.tscn | 46 +-- scripts/CompanionController.gd | 23 +- scripts/SystemAudioAnalyzer.gd | 203 +++++++++- tests/classic.bpm.translation | Bin 0 -> 4684 bytes tests/classic.centroid.translation | Bin 0 -> 4845 bytes tests/classic.conf.translation | Bin 0 -> 4565 bytes tests/classic.csv | 121 ++++++ tests/classic.csv.import | 19 + tests/classic.dembow.translation | Bin 0 -> 4567 bytes tests/classic.density.translation | Bin 0 -> 4576 bytes tests/classic.f0.translation | Bin 0 -> 4563 bytes tests/classic.f1.translation | Bin 0 -> 4563 bytes tests/classic.f10.translation | Bin 0 -> 4564 bytes tests/classic.f2.translation | Bin 0 -> 4563 bytes tests/classic.f3.translation | Bin 0 -> 4563 bytes tests/classic.f4.translation | Bin 0 -> 4563 bytes tests/classic.f5.translation | Bin 0 -> 4563 bytes tests/classic.f6.translation | Bin 0 -> 4563 bytes tests/classic.f7.translation | Bin 0 -> 4563 bytes tests/classic.f8.translation | Bin 0 -> 4563 bytes tests/classic.f9.translation | Bin 0 -> 4563 bytes tests/classic.flatness.translation | Bin 0 -> 4929 bytes tests/classic.fourfloor.translation | Bin 0 -> 4570 bytes tests/classic.highRatio.translation | Bin 0 -> 4930 bytes tests/classic.label.translation | Bin 0 -> 4614 bytes tests/classic.lowRatio.translation | Bin 0 -> 4929 bytes tests/classic.regularity.translation | Bin 0 -> 4571 bytes tests/classic.s.translation | Bin 0 -> 4566 bytes tests/hiphop.bpm.translation | Bin 0 -> 4680 bytes tests/hiphop.centroid.translation | Bin 0 -> 4869 bytes tests/hiphop.conf.translation | Bin 0 -> 4557 bytes tests/hiphop.csv | 121 ++++++ tests/hiphop.csv.import | 19 + tests/hiphop.dembow.translation | Bin 0 -> 4559 bytes tests/hiphop.density.translation | Bin 0 -> 4560 bytes tests/hiphop.f0.translation | Bin 0 -> 4555 bytes tests/hiphop.f1.translation | Bin 0 -> 4555 bytes tests/hiphop.f10.translation | Bin 0 -> 4556 bytes tests/hiphop.f2.translation | Bin 0 -> 4555 bytes tests/hiphop.f3.translation | Bin 0 -> 4555 bytes tests/hiphop.f4.translation | Bin 0 -> 4555 bytes tests/hiphop.f5.translation | Bin 0 -> 4555 bytes tests/hiphop.f6.translation | Bin 0 -> 4555 bytes tests/hiphop.f7.translation | Bin 0 -> 4555 bytes tests/hiphop.f8.translation | Bin 0 -> 4555 bytes tests/hiphop.f9.translation | Bin 0 -> 4555 bytes tests/hiphop.flatness.translation | Bin 0 -> 4921 bytes tests/hiphop.fourfloor.translation | Bin 0 -> 4562 bytes tests/hiphop.highRatio.translation | Bin 0 -> 4922 bytes tests/hiphop.label.translation | Bin 0 -> 4586 bytes tests/hiphop.lowRatio.translation | Bin 0 -> 4921 bytes tests/hiphop.regularity.translation | Bin 0 -> 4563 bytes tests/hiphop.s.translation | Bin 0 -> 4554 bytes tests/rock.bpm.translation | Bin 0 -> 4648 bytes tests/rock.centroid.translation | Bin 0 -> 4805 bytes tests/rock.conf.translation | Bin 0 -> 4509 bytes tests/rock.csv | 121 ++++++ tests/rock.csv.import | 19 + tests/rock.dembow.translation | Bin 0 -> 4511 bytes tests/rock.density.translation | Bin 0 -> 4512 bytes tests/rock.f0.translation | Bin 0 -> 4507 bytes tests/rock.f1.translation | Bin 0 -> 4507 bytes tests/rock.f10.translation | Bin 0 -> 4508 bytes tests/rock.f2.translation | Bin 0 -> 4507 bytes tests/rock.f3.translation | Bin 0 -> 4507 bytes tests/rock.f4.translation | Bin 0 -> 4507 bytes tests/rock.f5.translation | Bin 0 -> 4507 bytes tests/rock.f6.translation | Bin 0 -> 4507 bytes tests/rock.f7.translation | Bin 0 -> 4507 bytes tests/rock.f8.translation | Bin 0 -> 4507 bytes tests/rock.f9.translation | Bin 0 -> 4507 bytes tests/rock.flatness.translation | Bin 0 -> 4873 bytes tests/rock.fourfloor.translation | Bin 0 -> 4514 bytes tests/rock.highRatio.translation | Bin 0 -> 4874 bytes tests/rock.label.translation | Bin 0 -> 4462 bytes tests/rock.lowRatio.translation | Bin 0 -> 4873 bytes tests/rock.regularity.translation | Bin 0 -> 4515 bytes tests/rock.s.translation | Bin 0 -> 4506 bytes tests/rock2.bpm.translation | Bin 0 -> 4696 bytes tests/rock2.centroid.translation | Bin 0 -> 4829 bytes tests/rock2.conf.translation | Bin 0 -> 4537 bytes tests/rock2.csv | 120 ++++++ tests/rock2.csv.import | 19 + tests/rock2.dembow.translation | Bin 0 -> 4539 bytes tests/rock2.density.translation | Bin 0 -> 4540 bytes tests/rock2.f0.translation | Bin 0 -> 4535 bytes tests/rock2.f1.translation | Bin 0 -> 4535 bytes tests/rock2.f10.translation | Bin 0 -> 4536 bytes tests/rock2.f2.translation | Bin 0 -> 4535 bytes tests/rock2.f3.translation | Bin 0 -> 4535 bytes tests/rock2.f4.translation | Bin 0 -> 4535 bytes tests/rock2.f5.translation | Bin 0 -> 4535 bytes tests/rock2.f6.translation | Bin 0 -> 4535 bytes tests/rock2.f7.translation | Bin 0 -> 4535 bytes tests/rock2.f8.translation | Bin 0 -> 4535 bytes tests/rock2.f9.translation | Bin 0 -> 4535 bytes tests/rock2.flatness.translation | Bin 0 -> 4897 bytes tests/rock2.fourfloor.translation | Bin 0 -> 4542 bytes tests/rock2.highRatio.translation | Bin 0 -> 4898 bytes tests/rock2.label.translation | Bin 0 -> 4550 bytes tests/rock2.lowRatio.translation | Bin 0 -> 4897 bytes tests/rock2.regularity.translation | Bin 0 -> 4543 bytes tests/rock2.s.translation | Bin 0 -> 4534 bytes tools/analyze-features.ps1 | 73 ++++ tools/capture-features.ps1 | 68 ++++ tools/genre-regression.ps1 | 273 ++++++++++++++ 110 files changed, 1749 insertions(+), 52 deletions(-) create mode 100644 bin/build.ps1 create mode 100644 tests/classic.bpm.translation create mode 100644 tests/classic.centroid.translation create mode 100644 tests/classic.conf.translation create mode 100644 tests/classic.csv create mode 100644 tests/classic.csv.import create mode 100644 tests/classic.dembow.translation create mode 100644 tests/classic.density.translation create mode 100644 tests/classic.f0.translation create mode 100644 tests/classic.f1.translation create mode 100644 tests/classic.f10.translation create mode 100644 tests/classic.f2.translation create mode 100644 tests/classic.f3.translation create mode 100644 tests/classic.f4.translation create mode 100644 tests/classic.f5.translation create mode 100644 tests/classic.f6.translation create mode 100644 tests/classic.f7.translation create mode 100644 tests/classic.f8.translation create mode 100644 tests/classic.f9.translation create mode 100644 tests/classic.flatness.translation create mode 100644 tests/classic.fourfloor.translation create mode 100644 tests/classic.highRatio.translation create mode 100644 tests/classic.label.translation create mode 100644 tests/classic.lowRatio.translation create mode 100644 tests/classic.regularity.translation create mode 100644 tests/classic.s.translation create mode 100644 tests/hiphop.bpm.translation create mode 100644 tests/hiphop.centroid.translation create mode 100644 tests/hiphop.conf.translation create mode 100644 tests/hiphop.csv create mode 100644 tests/hiphop.csv.import create mode 100644 tests/hiphop.dembow.translation create mode 100644 tests/hiphop.density.translation create mode 100644 tests/hiphop.f0.translation create mode 100644 tests/hiphop.f1.translation create mode 100644 tests/hiphop.f10.translation create mode 100644 tests/hiphop.f2.translation create mode 100644 tests/hiphop.f3.translation create mode 100644 tests/hiphop.f4.translation create mode 100644 tests/hiphop.f5.translation create mode 100644 tests/hiphop.f6.translation create mode 100644 tests/hiphop.f7.translation create mode 100644 tests/hiphop.f8.translation create mode 100644 tests/hiphop.f9.translation create mode 100644 tests/hiphop.flatness.translation create mode 100644 tests/hiphop.fourfloor.translation create mode 100644 tests/hiphop.highRatio.translation create mode 100644 tests/hiphop.label.translation create mode 100644 tests/hiphop.lowRatio.translation create mode 100644 tests/hiphop.regularity.translation create mode 100644 tests/hiphop.s.translation create mode 100644 tests/rock.bpm.translation create mode 100644 tests/rock.centroid.translation create mode 100644 tests/rock.conf.translation create mode 100644 tests/rock.csv create mode 100644 tests/rock.csv.import create mode 100644 tests/rock.dembow.translation create mode 100644 tests/rock.density.translation create mode 100644 tests/rock.f0.translation create mode 100644 tests/rock.f1.translation create mode 100644 tests/rock.f10.translation create mode 100644 tests/rock.f2.translation create mode 100644 tests/rock.f3.translation create mode 100644 tests/rock.f4.translation create mode 100644 tests/rock.f5.translation create mode 100644 tests/rock.f6.translation create mode 100644 tests/rock.f7.translation create mode 100644 tests/rock.f8.translation create mode 100644 tests/rock.f9.translation create mode 100644 tests/rock.flatness.translation create mode 100644 tests/rock.fourfloor.translation create mode 100644 tests/rock.highRatio.translation create mode 100644 tests/rock.label.translation create mode 100644 tests/rock.lowRatio.translation create mode 100644 tests/rock.regularity.translation create mode 100644 tests/rock.s.translation create mode 100644 tests/rock2.bpm.translation create mode 100644 tests/rock2.centroid.translation create mode 100644 tests/rock2.conf.translation create mode 100644 tests/rock2.csv create mode 100644 tests/rock2.csv.import create mode 100644 tests/rock2.dembow.translation create mode 100644 tests/rock2.density.translation create mode 100644 tests/rock2.f0.translation create mode 100644 tests/rock2.f1.translation create mode 100644 tests/rock2.f10.translation create mode 100644 tests/rock2.f2.translation create mode 100644 tests/rock2.f3.translation create mode 100644 tests/rock2.f4.translation create mode 100644 tests/rock2.f5.translation create mode 100644 tests/rock2.f6.translation create mode 100644 tests/rock2.f7.translation create mode 100644 tests/rock2.f8.translation create mode 100644 tests/rock2.f9.translation create mode 100644 tests/rock2.flatness.translation create mode 100644 tests/rock2.fourfloor.translation create mode 100644 tests/rock2.highRatio.translation create mode 100644 tests/rock2.label.translation create mode 100644 tests/rock2.lowRatio.translation create mode 100644 tests/rock2.regularity.translation create mode 100644 tests/rock2.s.translation create mode 100644 tools/analyze-features.ps1 create mode 100644 tools/capture-features.ps1 create mode 100644 tools/genre-regression.ps1 diff --git a/bin/LoopbackCapture.cs b/bin/LoopbackCapture.cs index cbe0dac..53506ea 100644 --- a/bin/LoopbackCapture.cs +++ b/bin/LoopbackCapture.cs @@ -1,6 +1,12 @@ +// Exit codes: 0 = clean exit / parent ended; 2 = no render endpoint; +// 3 = instance already running; 4 = WASAPI initialization failed; +// 5 = unhandled exception / persistent capture error; +// 6 = lease expired (Godot is not responding). using System; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; +using System.IO; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; @@ -9,14 +15,423 @@ using System.Threading; namespace LoopbackCapture { + // Independent analysis branch: never writes to RMS/onset/BPM detector state. + sealed class RuleGenreAnalyzer + { + // TUNING TABLE: initial heuristics, NOT calibrated probabilities. Adjust here. + const int FftSize = 2048, ShortHops = 400, RhythmHops = 1600; + const int DynamicsSamples = 160, DynamicsHopCount = 10, MinDynamicsSamples = 40; + const int MinBars = 4, MinPeaks = 4; + const double FeatureAlpha = 0.05, Temperature = 0.20, ConfidenceThreshold = 0.30; + const double BandMinHz = 100, BandMaxHz = 8000, HighHz = 2000; + const double LowMinHz = 40, LowMaxHz = 120, MidMinHz = 200, MidMaxHz = 5000; + const double CentroidMinHz = 500, CentroidMaxHz = 4000; + const double FlatnessMin = 0.02, FlatnessMax = 0.50; + const double HighRatioMin = 0.05, HighRatioMax = 0.60, LowRatioMin = 0.05, LowRatioMax = 0.50; + const double DensityMax = 8, DynamicsMinDb = 6, DynamicsMaxDb = 24; + const double LatinMinBpm = 85, LatinMaxBpm = 105, ElectronicMinBpm = 115, ElectronicMaxBpm = 135; + const double HipHopMinBpm = 80, HipHopMaxBpm = 95, TempoShoulderBpm = 15; + // Il dembow e' una firma discreta, non un contributo lineare: sopra soglia sposta + // la decisione, sotto soglia non tocca nulla. Richiede anche affinita' di tempo + // >= 0.5, altrimenti una sincope qualsiasi a 130 BPM verrebbe promossa a latin. + // La soglia lavora sul dembow NORMALIZZATO (vedi DembowBaseline). + const double DembowGate = 0.40, DembowBonus = 0.35; + // Un istogramma uniforme correla gia' 7/16 con un template che ha 7 caselle attive + // su 16. Senza togliere questo pavimento, qualsiasi ritmo piatto (rock con piatti + // ovunque) ottiene ~0.44 e passa per un dembow debole. + const double DembowBaseline = 7.0 / 16.0; + // Il rilevatore puo' agganciare la cella 3+3+2 e riportare 4/3 del battito. + // Si prova anche l'ipotesi 3/4 e si tiene quella che spiega meglio il pattern. + const double FoldMargin = 0.05, MinFoldBpm = 50; + static readonly double[] FoldFactors = { 1.0, 0.75, 1.25 }; + const double RegularityCenter = 0.50, RegularityWidth = 0.50; + const double PeakSigma = 1, PowerEpsilon = 1e-20, RmsFloor = 1e-6, ActiveRms = 1e-5; + const int PublishMs = 1000, StaleMs = 1000; + // Columns: dembow, fourFloor, tempo affinity, low, flatness, high, density, + // centroid, regularity, medium regularity, dynamics. Negative = inhibitory. + // Each row has total absolute weight 1; Bias implements rewarded complements. + // Scores include Bias, then stable softmax(score / Temperature). + static readonly string[] Labels = { "latin", "electronic", "hiphop", "rock", "classical" }; + // Pesi derivati dalla distanza di Fisher misurata su dati reali etichettati + // (tests\rock2.csv, classic.csv, hiphop.csv). Le feature sono quasi ortogonali: + // flatness/highRatio separano classical da {rock, hiphop} ma NON rock da hiphop (d'~0.03); + // regularity/regMid/dynamics separano rock da hiphop ma non rock da classical. + // density non discrimina nessuna delle tre coppie (d' 0.14-0.45): peso azzerato. + // I Bias NON sono scelti a mano: sono il valore che porta ogni classe a 0 sulla media + // globale delle feature (bias_c = -w_c . mean). Senza questa compensazione una classe + // diventa il "vincitore per default" e ogni ritaratura sposta il problema su un'altra. + static readonly double[] Bias = { -0.273, -0.119, -0.197, 0.018, 0.191 }; + static readonly double[,] Weights = { + { 0.50, 0, 0.25, 0.25, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0.35, 0.25, 0.15, 0, 0, 0, 0, 0.25, 0, 0 }, + { 0, 0, 0, 0.15, 0, 0, 0, 0, 0.20, 0.35, 0.30 }, + { 0, 0, 0, 0, 0.25, 0.15, 0, 0, -0.20, -0.25, -0.15 }, + { 0, 0, 0, 0, -0.40, -0.45, 0, 0, 0, 0, 0.15 } + }; + static readonly int[] DembowTemplate = { 1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0 }; + readonly int rate, hop; + readonly double[] samples = new double[FftSize], hann = new double[FftSize]; + readonly double[] real = new double[FftSize], imag = new double[FftSize]; + readonly double[] cos = new double[FftSize / 2], sin = new double[FftSize / 2]; + readonly int[] reverse = new int[FftSize]; + readonly double[] previousPower = new double[FftSize / 2 + 1]; + readonly double[] shortOnset = new double[ShortHops], rhythm = new double[RhythmHops]; + readonly double[] envelope = new double[ShortHops], folded = new double[16]; + readonly double[] dynamics = new double[DynamicsSamples], sortedDynamics = new double[DynamicsSamples]; + readonly double[] features = new double[11], probabilities = new double[5]; + int write, filled, hopFrames, shortHead, shortCount, rhythmHead, rhythmCount; + int dynamicsHead, dynamicsCount, dynamicsHops, dynamicsFrames; + double dynamicsSum, recentRms, centroid, flatness, highRatio, lowRatio; + double dembow, fourFloor, density, regularity, dynamicRange; + bool spectrumReady, dynamicReady; + long lastDataMs = -1, lastPublishMs; + StreamWriter dump; + public double DembowPhase { get; private set; } + // Tempo effettivamente usato per il folding: puo' essere i 3/4 di quello rilevato + // se il pattern dimostra che il detector ha agganciato la cella 3+3+2. + public double EffectiveBpm { get; private set; } + + public RuleGenreAnalyzer(int sampleRate, int hopSize, string dumpPath) + { + rate = sampleRate; hop = hopSize; + for (int i = 0; i < FftSize; i++) + { + hann[i] = 0.5 - 0.5 * Math.Cos(2 * Math.PI * i / (FftSize - 1)); + int x = i, r = 0; + for (int b = 0; b < 11; b++) { r = (r << 1) | (x & 1); x >>= 1; } + reverse[i] = r; + } + for (int i = 0; i < cos.Length; i++) + { + cos[i] = Math.Cos(-2 * Math.PI * i / FftSize); + sin[i] = Math.Sin(-2 * Math.PI * i / FftSize); + } + if (!string.IsNullOrEmpty(dumpPath)) + { + try + { + dump = new StreamWriter(dumpPath, false, Encoding.UTF8); + dump.WriteLine("ms,bpm,dembow,fourfloor,density,flatness,centroid,regularity,highRatio,lowRatio,label,conf,f0_latin_dembow,f1_fourfloor,f2_tempo_latin,f3_low,f4_flat,f5_high,f6_density,f7_centroid,f8_reg,f9_regmid,f10_dyn,s_latin,s_electronic,s_hiphop,s_rock,s_classical"); + dump.Flush(); + } + catch (Exception ex) { DisableDump(ex); } + } + } + + void DisableDump(Exception ex) + { + Console.Error.WriteLine("Feature dump disabled: " + ex.Message); + if (dump != null) { try { dump.Dispose(); } catch { } dump = null; } + } + + public void MarkData(long now) { lastDataMs = now; } + + // Il folding ritmico dipende dal tempo: se il BPM cambia (nuovo brano), la storia + // gia' registrata e' su una griglia che non corrisponde piu'. Va scartata, altrimenti + // per fino a 16 s si pubblica un dembow/fourFloor casuale. + public void ResetRhythm() + { + rhythmHead = 0; + rhythmCount = 0; + Array.Clear(rhythm, 0, rhythm.Length); + dembow = 0; + fourFloor = 0; + DembowPhase = 0; + } + + // Errore di ottava del rilevatore: 85 BPM puo' uscire 170, 195 puo' uscire 97.5. + // Riporta il tempo in [70,145) prima di applicare sia i template di tempo sia il + // folding ritmico. Senza questa normalizzazione nessuna regola di tempo entra in + // gioco (LatinMin 85, HipHopMin 80) e vince sempre la classe senza termine ritmico. + public static double CanonicalTempo(double bpm) + { + if (bpm <= 0) return 0; + while (bpm >= 145.0) bpm /= 2.0; + while (bpm < 70.0) bpm *= 2.0; + return bpm; + } + + public void AddSample(float value) + { + double v = float.IsNaN(value) || float.IsInfinity(value) ? 0 : value; + samples[write] = v; write = (write + 1) % FftSize; + if (filled < FftSize) filled++; + dynamicsSum += v * v; dynamicsFrames++; + if (++hopFrames < hop) return; + hopFrames = 0; + double flux = filled == FftSize ? Spectrum() : 0; + shortOnset[shortHead] = flux; shortHead = (shortHead + 1) % ShortHops; + shortCount = Math.Min(shortCount + 1, ShortHops); + rhythm[rhythmHead] = flux; rhythmHead = (rhythmHead + 1) % RhythmHops; + rhythmCount = Math.Min(rhythmCount + 1, RhythmHops); + if (++dynamicsHops >= DynamicsHopCount) + { + recentRms = Math.Sqrt(dynamicsSum / Math.Max(1, dynamicsFrames)); + dynamics[dynamicsHead] = 20 * Math.Log10(Math.Max(RmsFloor, recentRms)); + dynamicsHead = (dynamicsHead + 1) % DynamicsSamples; + dynamicsCount = Math.Min(dynamicsCount + 1, DynamicsSamples); + dynamicsSum = 0; dynamicsFrames = 0; dynamicsHops = 0; + } + } + + // Real input, radix-2 complex workspace; only nonnegative frequency bins used. + // All FFT/window/twiddle/history arrays are preallocated and reused per hop. + double Spectrum() + { + for (int i = 0; i < FftSize; i++) + { + real[reverse[i]] = samples[(write + i) % FftSize] * hann[i]; + imag[reverse[i]] = 0; + } + for (int size = 2; size <= FftSize; size <<= 1) + { + int half = size / 2, stride = FftSize / size; + for (int start = 0; start < FftSize; start += size) + for (int j = 0; j < half; j++) + { + int a = start + j, b = a + half, t = j * stride; + double tr = cos[t] * real[b] - sin[t] * imag[b]; + double ti = sin[t] * real[b] + cos[t] * imag[b]; + real[b] = real[a] - tr; imag[b] = imag[a] - ti; + real[a] += tr; imag[a] += ti; + } + } + double total = 0, band = 0, weighted = 0, logs = 0, high = 0, low = 0, flux = 0; + int bins = 0; + for (int k = 0; k <= FftSize / 2; k++) + { + double hz = k * (double)rate / FftSize; + double p = (real[k] * real[k] + imag[k] * imag[k]) / (FftSize * (double)FftSize); + // One-sided power: DC/Nyquist occur once, other bins twice. + if (k > 0 && k < FftSize / 2) p *= 2; + total += p; + if (hz >= BandMinHz && hz <= BandMaxHz) + { band += p; weighted += hz * p; logs += Math.Log(Math.Max(PowerEpsilon, p)); bins++; } + if (hz > HighHz) high += p; + if (hz >= LowMinHz && hz <= LowMaxHz) low += p; + if (hz >= MidMinHz && hz <= MidMaxHz && spectrumReady) + flux += Math.Max(0, p - previousPower[k]); + previousPower[k] = p; + } + double smoothing = spectrumReady ? FeatureAlpha : 1; + centroid += smoothing * ((band > PowerEpsilon ? weighted / band : 0) - centroid); + flatness += smoothing * ((band > PowerEpsilon && bins > 0 ? Clamp(Math.Exp(logs / bins) / (band / bins)) : 0) - flatness); + highRatio += smoothing * ((total > PowerEpsilon ? high / total : 0) - highRatio); + lowRatio += smoothing * ((total > PowerEpsilon ? low / total : 0) - lowRatio); + spectrumReady = true; + return flux; + } + + static double Clamp(double x) { return Math.Max(0, Math.Min(1, x)); } + static double Normalize(double x, double min, double max) { return Clamp((x - min) / (max - min)); } + static double Tempo(double bpm, double min, double max) + { return bpm <= 0 ? 0 : Clamp(1 - Math.Max(min - bpm, Math.Max(0, bpm - max)) / TempoShoulderBpm); } + + void RhythmFeatures(double bpm) + { + double maximum = PowerEpsilon; + for (int i = 0; i < shortCount; i++) + { + envelope[i] = shortOnset[(shortHead - shortCount + i + ShortHops) % ShortHops]; + maximum = Math.Max(maximum, envelope[i]); + } + double mean = 0, variance = 0; + for (int i = 0; i < shortCount; i++) { envelope[i] /= maximum; mean += envelope[i]; } + mean /= Math.Max(1, shortCount); + for (int i = 0; i < shortCount; i++) variance += (envelope[i] - mean) * (envelope[i] - mean); + double threshold = mean + PeakSigma * Math.Sqrt(variance / Math.Max(1, shortCount)); + int peaks = 0, lastPeak = -1, intervals = 0; + double sum = 0, squares = 0; + for (int i = 1; i < shortCount - 1; i++) + if (envelope[i] > threshold && envelope[i] > envelope[i - 1] && envelope[i] >= envelope[i + 1]) + { + peaks++; + if (lastPeak >= 0) { double d = i - lastPeak; sum += d; squares += d * d; intervals++; } + lastPeak = i; + } + // Available duration during warm-up; exactly 4 s once the 400-slot ring is full. + density = peaks / Math.Max(0.01, shortCount / 100.0); + regularity = peaks < MinPeaks ? 0 : 1 - Clamp(Math.Sqrt(Math.Max(0, squares / intervals - Math.Pow(sum / intervals, 2))) / (sum / intervals)); + dembow = 0; fourFloor = 0; DembowPhase = 0; + EffectiveBpm = 0; + if (bpm <= 0) return; + + // Il pattern 3+3+2 crea periodicita' spurie a 4/3 e a 5/4 del battito: il + // detector puo' agganciare una cella invece del battito (95 BPM letti 127 o 76). + // Non lo si decide a priori: vince l'ipotesi che correla meglio col template. + double bestD = 0, bestF = 0, bestP = 0, bestT = 0; + bool found = false; + for (int h = 0; h < FoldFactors.Length; h++) + { + double d, f, p; + if (!Fold(bpm * FoldFactors[h], out d, out f, out p)) continue; + if (!found || d > bestD + FoldMargin) + { + bestD = d; bestF = f; bestP = p; bestT = bpm * FoldFactors[h]; + found = true; + } + } + if (found) { dembow = bestD; fourFloor = bestF; DembowPhase = bestP; EffectiveBpm = bestT; } + } + + bool Fold(double bpm, out double dembowScore, out double fourFloorScore, out double phaseScore) + { + dembowScore = 0; fourFloorScore = 0; phaseScore = 0; + if (bpm < MinFoldBpm) return false; + double hopPerBeat = 60 / bpm * 100, barHops = hopPerBeat * 4; + int bars = (int)Math.Floor(rhythmCount / barHops); + if (bars < MinBars) return false; + int count = (int)Math.Floor(bars * barHops); + Array.Clear(folded, 0, folded.Length); + double maximum = PowerEpsilon; + for (int i = 0; i < count; i++) maximum = Math.Max(maximum, rhythm[(rhythmHead - count + i + RhythmHops) % RhythmHops]); + for (int i = 0; i < count; i++) + folded[((int)Math.Floor(i / hopPerBeat * 4)) % 16] += rhythm[(rhythmHead - count + i + RhythmHops) % RhythmHops] / maximum / bars; + double sum = 0; + for (int i = 0; i < 16; i++) sum += folded[i]; + if (sum <= PowerEpsilon) return false; + for (int i = 0; i < 16; i++) folded[i] /= sum; + for (int phase = 0; phase < 16; phase++) + { + double correlation = 0; + for (int i = 0; i < 16; i++) correlation += folded[(i + phase) % 16] * DembowTemplate[i]; + // Unit-sum folded envelope, binary template: theoretical maximum dot = 1. + if (correlation > dembowScore) { dembowScore = Clamp(correlation); phaseScore = phase / 16.0; } + double mass = 0, weakest = 1; + for (int q = 0; q < 4; q++) + { double v = folded[(phase + 4 * q) % 16]; mass += v; weakest = Math.Min(weakest, v); } + // quarterMass * (weakest / meanQuarter): penalizes missing quarters. + // Uniform 16 bins => .25; four equal quarter hits => 1; missing hit => 0. + double floor = mass > 0 ? mass * Clamp(weakest / (mass / 4)) : 0; + fourFloorScore = Math.Max(fourFloorScore, Clamp(floor)); + } + // Rimuove il pavimento del 7/16: 0 = nessuna informazione ritmica, 1 = dembow pieno. + dembowScore = Clamp((dembowScore - DembowBaseline) / (1 - DembowBaseline)); + return true; + } + + double Percentile(double fraction) + { + double index = (dynamicsCount - 1) * fraction; + int lo = (int)index, hi = Math.Min(lo + 1, dynamicsCount - 1); + return sortedDynamics[lo] + (sortedDynamics[hi] - sortedDynamics[lo]) * (index - lo); + } + + public void Publish(long now, double bpm, UdpClient udp, IPEndPoint destination) + { + if (now - lastPublishMs < PublishMs) return; + lastPublishMs = now; + bool fresh = lastDataMs >= 0 && now - lastDataMs <= StaleMs; + RhythmFeatures(bpm); + // Il termine di tempo usa il BPM che ha vinto il confronto di folding, + // non quello grezzo del rilevatore. + double tempo = EffectiveBpm > 0 ? EffectiveBpm : bpm; + dynamicReady = dynamicsCount >= MinDynamicsSamples; + dynamicRange = 0; + if (dynamicReady) + { + Array.Copy(dynamics, sortedDynamics, dynamicsCount); + Array.Sort(sortedDynamics, 0, dynamicsCount); + dynamicRange = Percentile(0.90) - Percentile(0.10); + } + features[0] = dembow; features[1] = fourFloor; + features[3] = Normalize(lowRatio, LowRatioMin, LowRatioMax); + features[4] = Normalize(flatness, FlatnessMin, FlatnessMax); + features[5] = Normalize(highRatio, HighRatioMin, HighRatioMax); + features[6] = Normalize(density, 0, DensityMax); + features[7] = Normalize(centroid, CentroidMinHz, CentroidMaxHz); + features[8] = regularity; + features[9] = Clamp(1 - Math.Abs(regularity - RegularityCenter) / RegularityWidth); + features[10] = dynamicReady ? Normalize(dynamicRange, DynamicsMinDb, DynamicsMaxDb) : 0; + double maxScore = double.NegativeInfinity; + double[] rawScores = new double[Labels.Length]; + for (int c = 0; c < Labels.Length; c++) + { + features[2] = c == 0 ? Tempo(tempo, LatinMinBpm, LatinMaxBpm) : c == 1 ? Tempo(tempo, ElectronicMinBpm, ElectronicMaxBpm) : c == 2 ? Tempo(tempo, HipHopMinBpm, HipHopMaxBpm) : 0; + double score = Bias[c]; + for (int j = 0; j < features.Length; j++) score += features[j] * Weights[c, j]; + // Dembow come soglia, non come peso: un pattern 3+3+2 riconosciuto vale + // piu' di un contributo lineare, ma solo se il tempo e' compatibile. + if (c == 0 && dembow >= DembowGate && Tempo(tempo, LatinMinBpm, LatinMaxBpm) >= 0.5) + score += DembowBonus; + probabilities[c] = score; + rawScores[c] = score; + maxScore = Math.Max(maxScore, score); + } + double total = 0; + bool active = fresh && recentRms >= ActiveRms && shortCount >= ShortHops; + for (int c = 0; c < Labels.Length; c++) + { probabilities[c] = active ? Math.Exp((probabilities[c] - maxScore) / Temperature) : 1; total += probabilities[c]; } + for (int c = 0; c < Labels.Length; c++) + probabilities[c] /= total; + int best = 0; + for (int c = 1; c < Labels.Length; c++) if (probabilities[c] > probabilities[best]) best = c; + string label = probabilities[best] < ConfidenceThreshold ? "unknown" : Labels[best]; + StringBuilder packet = new StringBuilder(); + packet.AppendFormat(CultureInfo.InvariantCulture, "GENR:1;{0};{1:F3}", label, probabilities[best]); + for (int c = 0; c < Labels.Length; c++) packet.AppendFormat(CultureInfo.InvariantCulture, ";{0}={1:F3}", Labels[c], probabilities[c]); + try { byte[] bytes = Encoding.UTF8.GetBytes(packet.ToString()); udp.Send(bytes, bytes.Length, destination); } catch { } + if (dump != null) + { + try + { + StringBuilder row = new StringBuilder(); + row.AppendFormat(CultureInfo.InvariantCulture, + "{0},{1:F3},{2:F3},{3:F3},{4:F3},{5:F6},{6:F3},{7:F3},{8:F6},{9:F6},{10},{11:F3}", + now, tempo, fresh ? dembow : 0, fresh ? fourFloor : 0, fresh ? density : 0, + fresh ? flatness : 0, fresh ? centroid : 0, fresh ? regularity : 0, + fresh ? highRatio : 0, fresh ? lowRatio : 0, label, probabilities[best]); + // Valori normalizzati visti dal classificatore + punteggi grezzi per classe: + // servono a capire QUALE termine fa perdere una classe, non solo che perde. + for (int j = 0; j < features.Length; j++) row.AppendFormat(CultureInfo.InvariantCulture, ",{0:F3}", features[j]); + for (int c = 0; c < Labels.Length; c++) row.AppendFormat(CultureInfo.InvariantCulture, ",{0:F3}", rawScores[c]); + dump.WriteLine(row.ToString()); + dump.Flush(); // Once a second, never on the per-frame path. + } + catch (Exception ex) { DisableDump(ex); } + } + } + } + class Program { const int SIO_UDP_CONNRESET = -1744830452; static int selectedTargetPid = 0; // 0 = Tutto il sistema + static Mutex instanceMutex; + static ManualResetEvent cmdReady = new ManualResetEvent(false); + static long leaseDeadlineMs; static void Main(string[] args) { + try + { + Run(args); + } + catch (Exception ex) + { + Console.Error.WriteLine(ex); + Environment.Exit(5); + } + } + + static void Run(string[] args) + { + Stopwatch lifecycleClock = Stopwatch.StartNew(); + int leaseMs = 0; + string dumpPath = null; + foreach (string arg in args) + { + if (arg.StartsWith("--dump-features=", StringComparison.Ordinal)) + dumpPath = arg.Substring(16); + if (arg.StartsWith("--lease-ms=", StringComparison.Ordinal)) + { + int parsedLease; + if (int.TryParse(arg.Substring(11), out parsedLease) && parsedLease > 0) + leaseMs = parsedLease; + } + } + Interlocked.Exchange(ref leaseDeadlineMs, lifecycleClock.ElapsedMilliseconds + leaseMs); int port = 4242; int cmdPort = 4243; if (args.Length > 0) @@ -25,6 +440,35 @@ namespace LoopbackCapture cmdPort = port + 1; } + int parentPid = 0; + if (args.Length > 1) int.TryParse(args[1], out parentPid); + if (parentPid > 0) + { + Thread parentWatchdog = new Thread(() => + { + try + { + using (Process parent = Process.GetProcessById(parentPid)) + { + parent.WaitForExit(); + } + } + catch { } + Environment.Exit(0); + }); + parentWatchdog.IsBackground = true; + parentWatchdog.Start(); + } + + bool createdNew; + instanceMutex = new Mutex(false, "Local\\LoopbackCapture_" + port, out createdNew); + if (!createdNew) + { + Console.Error.WriteLine("LoopbackCapture: istanza gia attiva sulla porta " + port); + Environment.Exit(3); + } + GC.KeepAlive(instanceMutex); + UdpClient udpSend = null; try { @@ -44,6 +488,7 @@ namespace LoopbackCapture try { udpCmd = new UdpClient(cmdPort); + cmdReady.Set(); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); while (true) { @@ -57,6 +502,11 @@ namespace LoopbackCapture selectedTargetPid = pid; } } + else if (cmd.StartsWith("PING:", StringComparison.Ordinal)) + { + Interlocked.Exchange(ref leaseDeadlineMs, lifecycleClock.ElapsedMilliseconds + leaseMs); + } + // Unknown commands are deliberately ignored. } } catch { } @@ -64,29 +514,42 @@ namespace LoopbackCapture cmdListenerThread.IsBackground = true; cmdListenerThread.Start(); + // Thread.Start alone does not guarantee that the command socket is bound. + if (!cmdReady.WaitOne(2000)) + Console.Error.WriteLine("LoopbackCapture: command socket not ready after 2000 ms; continuing."); + + // Announce after command readiness (or its bounded diagnostic timeout). + try + { + byte[] hello = Encoding.UTF8.GetBytes("HELLO:2"); + udpSend.Send(hello, hello.Length, remoteEp); + } + catch { } + IMMDeviceEnumerator enumerator = (IMMDeviceEnumerator)new MMDeviceEnumeratorComObject(); IMMDevice device = null; int hr = enumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out device); if (hr != 0 || device == null) { hr = enumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eConsole, out device); - if (hr != 0 || device == null) return; + if (hr != 0 || device == null) Environment.Exit(2); } Guid iidMgr = typeof(IAudioSessionManager2).GUID; object oMgr; - device.Activate(ref iidMgr, 1, IntPtr.Zero, out oMgr); + hr = device.Activate(ref iidMgr, 1, IntPtr.Zero, out oMgr); + if (hr != 0 || oMgr == null) Environment.Exit(4); IAudioSessionManager2 sessionManager = (IAudioSessionManager2)oMgr; Guid iidAudioClient = typeof(IAudioClient).GUID; object oAudioClient; hr = device.Activate(ref iidAudioClient, 1, IntPtr.Zero, out oAudioClient); - if (hr != 0 || oAudioClient == null) return; + if (hr != 0 || oAudioClient == null) Environment.Exit(4); IAudioClient audioClient = (IAudioClient)oAudioClient; IntPtr pMixFormat; hr = audioClient.GetMixFormat(out pMixFormat); - if (hr != 0 || pMixFormat == IntPtr.Zero) return; + if (hr != 0 || pMixFormat == IntPtr.Zero) Environment.Exit(4); WAVEFORMATEX wf = (WAVEFORMATEX)Marshal.PtrToStructure(pMixFormat, typeof(WAVEFORMATEX)); int channels = wf.nChannels; @@ -112,15 +575,16 @@ namespace LoopbackCapture Guid emptySession = Guid.Empty; hr = audioClient.Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK, 10000000, 0, pMixFormat, ref emptySession); - if (hr != 0) return; + if (hr != 0) Environment.Exit(4); Guid iidCaptureClient = typeof(IAudioCaptureClient).GUID; object oCaptureClient; hr = audioClient.GetService(ref iidCaptureClient, out oCaptureClient); - if (hr != 0 || oCaptureClient == null) return; + if (hr != 0 || oCaptureClient == null) Environment.Exit(4); IAudioCaptureClient captureClient = (IAudioCaptureClient)oCaptureClient; - audioClient.Start(); + hr = audioClient.Start(); + if (hr != 0) Environment.Exit(4); // Filtro Passa-Basso sui Sub-Bassi (cassa e basse frequenze: 120 Hz) float cutoffFreq = 120.0f; @@ -134,6 +598,7 @@ namespace LoopbackCapture // Buffer circolare onset flux temporizzato ai campioni audio reali (100 Hz = ogni 10ms esatti) int hopSize = sampleRate / 100; if (hopSize < 1) hopSize = 480; + RuleGenreAnalyzer genreAnalyzer = new RuleGenreAnalyzer(sampleRate, hopSize, dumpPath); const int BUFFER_HOPS = 400; // 4.0 secondi di finestra temporale float[] onsetBuffer = new float[BUFFER_HOPS]; int onsetHead = 0; @@ -146,15 +611,50 @@ namespace LoopbackCapture float prevHopTotalRms = 0; float detectedBpm = 0.0f; + double foldedBpm = 0.0; // tempo canonico con cui e' stato costruito lo storico ritmico int candidateBpm = 0; int candidateStreak = 0; int bpmEvalCounter = 0; long lastAppListBroadcast = 0; int myPid = Process.GetCurrentProcess().Id; + long lastHeartbeat = -250; + long heartbeatCounter = 0; + long captureErrorSince = -1; while (true) { + if (leaseMs > 0 && lifecycleClock.ElapsedMilliseconds > Interlocked.Read(ref leaseDeadlineMs)) + { + // Prefer clean parent termination even if its watchdog has not run yet. + if (parentPid > 0) + { + try + { + using (Process parent = Process.GetProcessById(parentPid)) + { + if (parent.HasExited) Environment.Exit(0); + } + } + catch { Environment.Exit(0); } + } + // A PING may have renewed the lease while checking the parent. + if (lifecycleClock.ElapsedMilliseconds > Interlocked.Read(ref leaseDeadlineMs)) + { + Console.Error.WriteLine("LoopbackCapture: lease expired (Godot is not responding)."); + Environment.Exit(6); + } + } + if (lifecycleClock.ElapsedMilliseconds - lastHeartbeat >= 250) + { + lastHeartbeat = lifecycleClock.ElapsedMilliseconds; + try + { + byte[] heartbeat = Encoding.UTF8.GetBytes(string.Format("HB:{0};0", heartbeatCounter++)); + udpSend.Send(heartbeat, heartbeat.Length, remoteEp); + } + catch { } + } // 1. Lettura campioni PCM WASAPI dal loopback di sistema uint packetLength = 0; hr = captureClient.GetNextPacketSize(out packetLength); @@ -168,6 +668,7 @@ namespace LoopbackCapture hr = captureClient.GetBuffer(out pData, out numFramesRead, out flags, out devPos, out qpcPos); if (hr != 0) break; + if (numFramesRead > 0) genreAnalyzer.MarkData(lifecycleClock.ElapsedMilliseconds); if ((flags & 1) == 0 && numFramesRead > 0) { @@ -200,6 +701,7 @@ namespace LoopbackCapture monoSample /= channels; } + genreAnalyzer.AddSample((flags & 2) != 0 ? 0f : monoSample); totalSumSq += (monoSample * monoSample); // Filtro IIR passa-basso a doppio polo per estrarre la cassa @@ -243,6 +745,7 @@ namespace LoopbackCapture } else { + for (uint f = 0; f < numFramesRead; f++) genreAnalyzer.AddSample(0f); currentTotalRms *= 0.7f; } @@ -250,6 +753,18 @@ namespace LoopbackCapture hr = captureClient.GetNextPacketSize(out packetLength); } + // A full second of consecutive failed capture iterations is persistent. + if (hr != 0) + { + if (captureErrorSince < 0) captureErrorSince = lifecycleClock.ElapsedMilliseconds; + if (lifecycleClock.ElapsedMilliseconds - captureErrorSince >= 1000) + { + Console.Error.WriteLine("Persistent WASAPI capture error: " + hr); + Environment.Exit(5); + } + } + else captureErrorSince = -1; + // 2. Volume mirato se selezionata una specifica applicazione (es. Spotify/Chrome) float displayRms = currentTotalRms; if (selectedTargetPid > 0 && sessionManager != null) @@ -427,6 +942,22 @@ namespace LoopbackCapture } } + // Il folding ritmico e' valido solo sullo stesso brano. Il ring contiene envelope + // di onset indipendenti dal tempo: il problema non e' il BPM in se', ma mediare + // battute di brani diversi. Serve quindi un salto DISCRETO di tempo, non la deriva + // dell'inseguimento morbido (0.94/0.06), che altrimenti azzererebbe lo storico + // a ogni gradino e dembow resterebbe sempre a zero. + // Il confronto usa il tempo canonico: un flip di ottava del rilevatore (170 -> 171) + // non deve azzerare nulla, mentre un cambio reale di brano si'. + double canonicalBpm = RuleGenreAnalyzer.CanonicalTempo(detectedBpm); + if (detectedBpm > 50.0f && Math.Abs(canonicalBpm - foldedBpm) > 10.0) + { + genreAnalyzer.ResetRhythm(); + } + foldedBpm = canonicalBpm; + + genreAnalyzer.Publish(lifecycleClock.ElapsedMilliseconds, canonicalBpm, udpSend, remoteEp); + // 4. Invio lista applicazioni attive (FILTRANDO se stesso e Godot!) long nowTicks = DateTime.UtcNow.Ticks; if ((nowTicks - lastAppListBroadcast) >= (TimeSpan.TicksPerMillisecond * 1500) && sessionManager != null) diff --git a/bin/LoopbackCapture.exe b/bin/LoopbackCapture.exe index 3c986355ecfe73a1cd4447e11af339431788ba9e..c93c1f4fea17b46431e9b6faa26895b6b8216c97 100644 GIT binary patch literal 28160 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ℜ59Lu)zNXt+dy| delta 7194 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 diff --git a/bin/build.ps1 b/bin/build.ps1 new file mode 100644 index 0000000..4e1797c --- /dev/null +++ b/bin/build.ps1 @@ -0,0 +1,10 @@ +$csc = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" +if (-not (Test-Path $csc)) { + $csc = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" +} +if (-not (Test-Path $csc)) { + Write-Error "Compilatore .NET Framework csc.exe non trovato (Framework64 / Framework)." + exit 1 +} +& $csc /nologo /unsafe /optimize+ /target:exe /out:bin\LoopbackCapture.exe bin\LoopbackCapture.cs +exit $LASTEXITCODE diff --git a/project.godot b/project.godot index 6012f36..215cba8 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,7 @@ config/icon="res://icon.svg" [audio] +buses/default_bus_layout="uid://de2evqqag5qan" driver/enable_input=true [display] diff --git a/scenes/Main.tscn b/scenes/Main.tscn index be5de87..bd55ac3 100644 --- a/scenes/Main.tscn +++ b/scenes/Main.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=5 format=3] +[gd_scene format=3 uid="uid://dsx8ygbmfsyj8"] -[ext_resource type="Script" path="res://scripts/SystemAudioAnalyzer.gd" id="1_audio_analyzer"] -[ext_resource type="Script" path="res://scripts/CompanionController.gd" id="2_companion"] -[ext_resource type="Texture2D" path="res://icon.svg" id="3_icon"] +[ext_resource type="Script" uid="uid://c76vsjv0asi61" path="res://scripts/SystemAudioAnalyzer.gd" id="1_audio_analyzer"] +[ext_resource type="Script" uid="uid://b8bfvlbipx8j8" path="res://scripts/CompanionController.gd" id="2_companion"] +[ext_resource type="Texture2D" uid="uid://c2yvovlrnbclm" path="res://icon.svg" id="3_icon"] [sub_resource type="SpriteFrames" id="SpriteFrames_1"] animations = [{ @@ -11,14 +11,6 @@ animations = [{ "texture": ExtResource("3_icon") }], "loop": true, -"name": &"idle", -"speed": 5.0 -}, { -"frames": [{ -"duration": 1.0, -"texture": ExtResource("3_icon") -}], -"loop": true, "name": &"dance", "speed": 10.0 }, { @@ -27,16 +19,24 @@ animations = [{ "texture": ExtResource("3_icon") }], "loop": true, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": ExtResource("3_icon") +}], +"loop": true, "name": &"sleep", "speed": 2.0 }] -[node name="Main" type="Node2D"] +[node name="Main" type="Node2D" unique_id=36355540] -[node name="SystemAudioAnalyzer" type="Node" parent="."] +[node name="SystemAudioAnalyzer" type="Node" parent="." unique_id=1763523839] script = ExtResource("1_audio_analyzer") -[node name="Companion" type="Node2D" parent="." node_paths=PackedStringArray("audio_analyzer", "sprite", "debug_label", "volume_bar", "app_selector")] +[node name="Companion" type="Node2D" parent="." unique_id=444784374 node_paths=PackedStringArray("audio_analyzer", "sprite", "debug_label", "volume_bar", "app_selector")] position = Vector2(200, 280) script = ExtResource("2_companion") audio_analyzer = NodePath("../SystemAudioAnalyzer") @@ -45,14 +45,14 @@ debug_label = NodePath("../UI/MarginContainer/VBoxContainer/DebugLabel") volume_bar = NodePath("../UI/MarginContainer/VBoxContainer/VolumeBar") app_selector = NodePath("../UI/MarginContainer/VBoxContainer/AppSelector") -[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Companion"] +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Companion" unique_id=1873221699] scale = Vector2(1.2, 1.2) sprite_frames = SubResource("SpriteFrames_1") animation = &"idle" -[node name="UI" type="CanvasLayer" parent="."] +[node name="UI" type="CanvasLayer" parent="." unique_id=2055130498] -[node name="MarginContainer" type="MarginContainer" parent="UI"] +[node name="MarginContainer" type="MarginContainer" parent="UI" unique_id=700137692] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -63,29 +63,29 @@ theme_override_constants/margin_top = 16 theme_override_constants/margin_right = 16 theme_override_constants/margin_bottom = 16 -[node name="VBoxContainer" type="VBoxContainer" parent="UI/MarginContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="UI/MarginContainer" unique_id=969047865] layout_mode = 2 size_flags_vertical = 0 theme_override_constants/separation = 6 -[node name="TitleLabel" type="Label" parent="UI/MarginContainer/VBoxContainer"] +[node name="TitleLabel" type="Label" parent="UI/MarginContainer/VBoxContainer" unique_id=2017771158] layout_mode = 2 theme_override_colors/font_color = Color(0.9, 0.9, 0.9, 1) theme_override_font_sizes/font_size = 13 text = "Desktop Companion" horizontal_alignment = 1 -[node name="AppSelector" type="OptionButton" parent="UI/MarginContainer/VBoxContainer"] +[node name="AppSelector" type="OptionButton" parent="UI/MarginContainer/VBoxContainer" unique_id=1135696676] layout_mode = 2 tooltip_text = "Seleziona l'applicazione da ascoltare (Spotify, Chrome, ecc.)" -[node name="VolumeBar" type="ProgressBar" parent="UI/MarginContainer/VBoxContainer"] +[node name="VolumeBar" type="ProgressBar" parent="UI/MarginContainer/VBoxContainer" unique_id=426369941] custom_minimum_size = Vector2(0, 8) layout_mode = 2 max_value = 1.0 show_percentage = false -[node name="DebugLabel" type="Label" parent="UI/MarginContainer/VBoxContainer"] +[node name="DebugLabel" type="Label" parent="UI/MarginContainer/VBoxContainer" unique_id=826112804] layout_mode = 2 theme_override_colors/font_color = Color(0.65, 0.9, 0.75, 1) theme_override_font_sizes/font_size = 12 diff --git a/scripts/CompanionController.gd b/scripts/CompanionController.gd index 970aab8..99039d6 100644 --- a/scripts/CompanionController.gd +++ b/scripts/CompanionController.gd @@ -27,6 +27,8 @@ enum State { var current_state: State = State.IDLE var _silence_timer: float = 0.0 var _current_rms: float = 0.0 +var _current_genre: String = "" +var _current_genre_conf: float = 0.0 # BPM dinamico: parte da 0 finché la canzone non viene agganciata var _current_bpm: float = 0.0 @@ -48,6 +50,7 @@ func _ready() -> void: audio_analyzer.volume_updated.connect(_on_volume_updated) audio_analyzer.bpm_updated.connect(_on_bpm_updated) audio_analyzer.applications_updated.connect(_on_applications_updated) + audio_analyzer.genre_updated.connect(_on_genre_updated) if app_selector: app_selector.item_selected.connect(_on_app_selected) @@ -56,18 +59,22 @@ func _ready() -> void: _set_state(State.IDLE) +func _on_genre_updated(genre: String, confidence: float, _probs: Dictionary) -> void: + _current_genre = genre + _current_genre_conf = confidence + func _on_applications_updated(apps: Array[Dictionary]) -> void: if not app_selector: return # Evita di ricreare la lista se gli elementi sono identici (previene glitch della UI) - var is_same = (apps.size() == _known_apps.size()) - if is_same: + var issame = (apps.size() == _known_apps.size()) + if issame: for i in range(apps.size()): if apps[i]["pid"] != _known_apps[i]["pid"] or apps[i]["name"] != _known_apps[i]["name"]: - is_same = false + issame = false break - if is_same: + if issame: return _known_apps = apps @@ -207,8 +214,12 @@ func _update_debug_ui() -> void: if _current_bpm > 50.0: bpm_str = "%d BPM" % round(_current_bpm) - debug_label.text = "Stato: %s | Volume: %.2f | %s" % [ + var genre_str: String = "Genere: --" + if not _current_genre.is_empty() and _current_genre != "unknown": + genre_str = "%s (%d%%)" % [_current_genre, roundi(_current_genre_conf * 100.0)] + debug_label.text = "Stato: %s | Volume: %.2f | %s | %s" % [ State.keys()[current_state], _current_rms, - bpm_str + bpm_str, + genre_str ] diff --git a/scripts/SystemAudioAnalyzer.gd b/scripts/SystemAudioAnalyzer.gd index 64121dc..4ed3ee3 100644 --- a/scripts/SystemAudioAnalyzer.gd +++ b/scripts/SystemAudioAnalyzer.gd @@ -7,9 +7,18 @@ signal volume_updated(rms_value: float) signal bpm_updated(bpm: float) ## Emette la lista delle applicazioni audio attive (es. Spotify, Chrome, Discord) signal applications_updated(apps: Array[Dictionary]) +signal genre_updated(genre: String, confidence: float, probs: Dictionary) @export var udp_port: int = 4242 @export var cmd_port: int = 4243 +@export var heartbeat_timeout_ms: int = 1500 +@export var lease_enabled: bool = true +@export var genre_enabled: bool = true + +const LEASE_MS: int = 10000 +const GENRE_LABELS = ["latin", "electronic", "hiphop", "rock", "classical"] +const GENRE_ALPHA: float = 0.25 +const GENRE_MIN_CONFIDENCE: float = 0.30 @export_group("Gain & Sensitivity") @export var system_audio_gain: float = 3.8 @@ -21,8 +30,23 @@ var _loopback_pid: int = -1 var _loopback_rms: float = 0.0 var _last_bpm: float = 0.0 var _watchdog_timer: float = 0.0 +var _last_heartbeat_msec: int = 0 +var _bridge_protocol: int = 0 +var _restart_delay: float = 1.0 +var _next_restart_at: int = 0 +var _selected_pid: int = 0 +var _restore_selection_at: int = -1 +var _healthy_since: int = -1 +var _last_health_packet: int = -1 +var _restart_attempt: bool = false +var _bridge_enabled: bool = false +var _last_ping_msec: int = 0 +var _genre_probs: Dictionary = {} +var _genre_argmax: String = "" +var _genre_last_emit_msec: int = -5000 func _ready() -> void: + process_mode = Node.PROCESS_MODE_ALWAYS _init_native_wasapi_loopback() func _init_native_wasapi_loopback() -> void: @@ -35,27 +59,97 @@ func _init_native_wasapi_loopback() -> void: _udp_send.set_dest_address("127.0.0.1", cmd_port) if err == OK: - var exe_path = ProjectSettings.globalize_path("res://bin/LoopbackCapture.exe") - if FileAccess.file_exists("res://bin/LoopbackCapture.exe"): - _loopback_pid = OS.create_process(exe_path, [str(udp_port)], false) + _bridge_enabled = true + _spawn_bridge() + +func _spawn_bridge() -> void: + var now: int = Time.get_ticks_msec() + if now < _next_restart_at: + return + # Discard queued packets from the preceding session without closing the socket. + while _udp_peer.get_available_packet_count() > 0: + _udp_peer.get_packet() + _bridge_protocol = 0 + _genre_probs.clear() + _genre_argmax = "" + _genre_last_emit_msec = -5000 + _last_heartbeat_msec = now + _healthy_since = -1 + _last_health_packet = -1 + var exe_path = ProjectSettings.globalize_path("res://bin/LoopbackCapture.exe") + if FileAccess.file_exists("res://bin/LoopbackCapture.exe"): + var args: PackedStringArray = [str(udp_port), str(OS.get_process_id())] + if lease_enabled and not OS.is_debug_build(): + args.append("--lease-ms=%d" % LEASE_MS) + _loopback_pid = OS.create_process(exe_path, args, false) + else: + _loopback_pid = -1 + if _loopback_pid <= 0: + _schedule_restart("avvio fallito") + else: + _restore_selection_at = now + 300 + _send_ping() + +func _send_ping() -> void: + if _udp_send and _loopback_pid > 0 and OS.is_process_running(_loopback_pid): + _last_ping_msec = Time.get_ticks_msec() + _udp_send.put_packet(("PING:%d" % _last_ping_msec).to_utf8_buffer()) + +func _schedule_restart(reason: String, exit_code: int = -1) -> void: + if _restart_attempt: + _restart_delay = minf(_restart_delay * 2.0, 30.0) + if exit_code == 3: + print("[SystemAudioAnalyzer] istanza gia attiva, attendo") + _restart_delay = 30.0 + # Limite noto: un'istanza vecchia senza heartbeat non viene terminata. + print("[SystemAudioAnalyzer] Riavvio: %s; attesa %.1f s" % [reason, _restart_delay]) + _next_restart_at = Time.get_ticks_msec() + int(_restart_delay * 1000.0) + _restart_attempt = true + _loopback_pid = -1 + _restore_selection_at = -1 + _healthy_since = -1 + +func _record_health_packet(now: int) -> void: + if _loopback_pid <= 0: + return + if _last_health_packet < 0 or now - _last_health_packet > heartbeat_timeout_ms: + _healthy_since = now + _last_health_packet = now + if now - _healthy_since >= 10000: + _restart_delay = 1.0 + _restart_attempt = false + +func _check_bridge_lifecycle() -> void: + if not _bridge_enabled: + return + var now: int = Time.get_ticks_msec() + if _loopback_pid <= 0: + if now >= _next_restart_at: + _spawn_bridge() + return + if not OS.is_process_running(_loopback_pid): + _schedule_restart("processo terminato", OS.get_process_exit_code(_loopback_pid)) + elif _bridge_protocol > 0: + # Finche' non arriva il primo HB l'exe puo' essere ancora in inizializzazione + # WASAPI: concedi una finestra piu' ampia per evitare falsi timeout a freddo. + var timeout: int = heartbeat_timeout_ms + if _last_health_packet < 0: + timeout = maxi(heartbeat_timeout_ms, 5000) + if now - _last_heartbeat_msec > timeout: + OS.kill(_loopback_pid) + _schedule_restart("timeout heartbeat") ## Invia al bridge la richiesta di ascoltare SOLO l'applicazione con il PID specificato (0 = Tutto) func select_application_pid(pid: int) -> void: + _selected_pid = pid if _udp_send: var msg = "PID:%d" % pid _udp_send.put_packet(msg.to_utf8_buffer()) print("[SystemAudioAnalyzer] Applicazione audio selezionata PID: ", pid) func _process(delta: float) -> void: - # Watchdog: se LoopbackCapture non è in esecuzione, riavvialo automaticamente - _watchdog_timer += delta - if _watchdog_timer >= 2.0: - _watchdog_timer = 0.0 - if _loopback_pid <= 0 or not OS.is_process_running(_loopback_pid): - var exe_path = ProjectSettings.globalize_path("res://bin/LoopbackCapture.exe") - if FileAccess.file_exists("res://bin/LoopbackCapture.exe"): - _loopback_pid = OS.create_process(exe_path, [str(udp_port)], false) - + if Time.get_ticks_msec() - _last_ping_msec >= 2000: + _send_ping() # Lettura esclusiva dell'Audio di Sistema o dell'Applicazione selezionata (Zero Microfono) if _udp_peer: var packet_received: bool = false @@ -67,9 +161,35 @@ func _process(delta: float) -> void: var text: String = packet.get_string_from_utf8() _parse_applications_list(text) continue + if packet.size() >= 3 and packet[0] == 72 and packet[1] == 66 and packet[2] == 58: + _last_heartbeat_msec = Time.get_ticks_msec() + _record_health_packet(_last_heartbeat_msec) + continue + if packet.size() >= 6 and packet[0] == 72 and packet[1] == 69 and packet[2] == 76 and packet[3] == 76 and packet[4] == 79 and packet[5] == 58: + if _bridge_protocol == 0 and _loopback_pid > 0: + _bridge_protocol = packet.get_string_from_utf8().substr(6).to_int() + _last_heartbeat_msec = Time.get_ticks_msec() + _healthy_since = -1 + _last_health_packet = -1 + select_application_pid(_selected_pid) + # Retain the 300ms resend for legacy bridges without command readiness. + continue - # Pacchetto audio standard: 8 byte (4 byte RMS + 4 byte BPM) - if packet.size() >= 4: + if packet.size() >= 5 and packet[0] == 71 and packet[1] == 69 and packet[2] == 78 and packet[3] == 82 and packet[4] == 58: + if genre_enabled: + _parse_genre(packet.get_string_from_utf8()) + continue + + # Convenzione: le future estensioni testuali non devono MAI essere lunghe + # esattamente 8 byte (messaggio completo, non solo prefisso). + # HELLO:/HB:/APPS:/GENR: sono riconosciuti sopra; PING: e i futuri STATUS:/SILENT: + # devono rispettare la convenzione o essere gestiti prima del ramo binario. + # Nessuna euristica sui byte: anche 0x41 e' legittimo in un float little-endian. + # Pacchetto audio standard: 8 byte (4 byte RMS + 4 byte BPM). + if packet.size() == 8: + # No HELLO means legacy mode: process liveness only, no HB timeout. + if _bridge_protocol == 0: + _record_health_packet(Time.get_ticks_msec()) _loopback_rms = packet.decode_float(0) packet_received = true @@ -82,6 +202,16 @@ func _process(delta: float) -> void: if not packet_received: _loopback_rms = move_toward(_loopback_rms, 0.0, delta * 3.0) + # Read queued heartbeats before checking the watchdog to avoid false timeouts. + _watchdog_timer += delta + if _watchdog_timer >= 0.5: + _watchdog_timer = 0.0 + _check_bridge_lifecycle() + if _restore_selection_at >= 0 and Time.get_ticks_msec() >= _restore_selection_at: + _restore_selection_at = -1 + if _loopback_pid > 0 and OS.is_process_running(_loopback_pid): + select_application_pid(_selected_pid) + # Calcolo Volume Percepito (Curva Loudness) var processed_rms: float = 0.0 if _loopback_rms > system_noise_floor: @@ -89,6 +219,47 @@ func _process(delta: float) -> void: volume_updated.emit(processed_rms) +func _parse_genre(raw_text: String) -> void: + var fields: PackedStringArray = raw_text.substr(5).split(";") + if fields.size() < 8: + return + # Version, raw label and raw confidence precede the five probabilities. + # The displayed label/confidence are recomputed from the smoothed distribution. + var incoming: Dictionary = {} + var total: float = 0.0 + for i in range(3, fields.size()): + var pair: PackedStringArray = fields[i].split("=") + if pair.size() != 2 or not GENRE_LABELS.has(pair[0]): + continue + if incoming.has(pair[0]) or not pair[1].is_valid_float(): + return + var probability: float = pair[1].to_float() + if not is_finite(probability) or probability < 0.0 or probability > 1.0: + return + incoming[pair[0]] = probability + total += probability + if incoming.size() != GENRE_LABELS.size() or total <= 0.0: + return + var first: bool = _genre_probs.is_empty() + var best: String = "" + var confidence: float = -1.0 + for genre in GENRE_LABELS: + var probability: float = float(incoming[genre]) / total + if first: + _genre_probs[genre] = probability + else: + _genre_probs[genre] = lerpf(float(_genre_probs[genre]), probability, GENRE_ALPHA) + if float(_genre_probs[genre]) > confidence: + confidence = float(_genre_probs[genre]) + best = genre + var label: String = best if confidence >= GENRE_MIN_CONFIDENCE else "unknown" + var now: int = Time.get_ticks_msec() + if best != _genre_argmax or now - _genre_last_emit_msec >= 5000: + _genre_argmax = best + _genre_last_emit_msec = now + print("[SystemAudioAnalyzer] Genere: %s (%.0f%%)" % [label, confidence * 100.0]) + genre_updated.emit(label, confidence, _genre_probs.duplicate()) + func _parse_applications_list(raw_text: String) -> void: var payload = raw_text.substr(5) var tokens = payload.split(";") @@ -97,8 +268,8 @@ func _parse_applications_list(raw_text: String) -> void: var parts = token.split(":") if parts.size() >= 2: var pid = int(parts[0]) - var name = parts[1] - apps.append({"pid": pid, "name": name}) + var curr_name = parts[1] + apps.append({"pid": pid, "name": curr_name}) if not apps.is_empty(): applications_updated.emit(apps) diff --git a/tests/classic.bpm.translation b/tests/classic.bpm.translation new file mode 100644 index 0000000000000000000000000000000000000000..3d25cc27603ea709e671d4011a70eb255c60e564 GIT binary patch literal 4684 zcma)A4RBP|6@LC;07*t-fPfY72N2Zdy?t-r53&AH7>Ed%YBbamHk*ZA*kse)1er(? zGDag%1k#!e@*|4Clu&4-aWu3;1RJAFg?7N$hCrH?0q<;hsEG8!-EshV~jyie9Y zJ9^RHHNkJl@8AqUPA)7FPR6Sep>T059ty^aE91qfEgYa8mhb4~m-$Q(YbEkn_u)p#6pByi8q| z@?YR<>w%kLjj-LYCRj5}&OeqG)7pn=+zG^|Vdr4yVV}dkglX5}y@m~g3C(Qyxv;Sk zcPIC!0Cn!$!27uWFvnRO=K`PNKItx$e2PmEm#1+n5U+wg58D8v-<$EUM)>%n(YQbR z)sRcygG28++1BR1Sr!&WEb>CVnX^rvLu;#xY9hat>PU<1f6?lj=w8$7W3T??YkCLh z=YXs(Z{(R4Mg3y?;T?;yF6xEuh{n6Jhf2DFe}2@qUu=k?nr%owf8Xr03V?7Z_hC@;8l|@#Q$FpV0BWeXyIJ z!E~L5t-o15QObwQ`nEM}nDUU+w{CJnWQwA`Xy=g7n^K;r|F!X#v$G`LePVCUGm83? zv+n)+UPb?v!_MW#Me|&K^bnpRd$!>Qc0K#q z-4bp5NYN*EQ1GX>NP1%4H~Uv~3@G|P_Rx;@0}7qB$=enjk@DfPebooWCiY5mtPUTa zt1J4Awa4dXNxGuGXk{|;BZ(jF4eqL!Vz{hN`_YWXsKkr!KRZWMkDs-Nk*;d`8(8>6$=P~*w5cer`j&vs0 zJgeaMWbL}GO~KE$`aTIO`p&(utNA(wUsPW>d4i;aEo9Ht_v>#R{wRhJ^RxsyGODHe zvN0o^8x;G!eR%%^pGtM&J~Fz8W@JNKd^^*(9<4b$$2RSh@|WK{koAt#Cv*SAfB#*I z9~t!H9XX1=MK|tQx=+dzeP921XW<_dd{52&kLF1{TsF^~w)X}b(mWltqdQ-b@`P^P zUl$x6A?1nszTPpX9+3FOft-O|iuzX1*uPiG6ZK`s3*usr2oo=S^x|+u{e;D%+OJ6U zaM}E=AO7y1KPvbG2jlzbTTGm%$e(dwQlLV?pD$Txe>_j2e>}hTV4W&o>-}Jx#KUF#Gdpj{h7Tm2 zGZ+3;`LPs>eW}mA^c;Oprr+nHE!#FfsnC6Q&ZWcCB%R~?c6a|2CnT=ocs>+^I;n(GNFcrGV~<#!o?j&F$Kdc6_eKNQdeu1tS3hXasOrisy1^*4^)C{Y;(R zpBX>_CbJ#QF?}`$1O)gV`dNye(sUgr?WEe;F6(Fe1Jo!$Dwu^*Am*~0wy~jzTp9v< zh7JHj#}J4dND~Pa0BtfdU3Rx_YFu_$w4aRhC=(HFBnn(K0^sNfj1)=RgNS#~*_PWL zD-Y0yxIQb@h>n^f6T@TN)Ry~Gr(&cIP8a9Ew!laoqu*n5nyE*_(%IcwCL_7DNe_eT z^P8-@k($~t*zktV+8P$ubTtRv1D59CsIaX77kdq`Jr*$t;E0hD@HqjUAYhsV2F7(P sR_Ed1{Ag?W3>$4NpN%IADXs-E00sm&9{M4|NVw=5ir(J>{5#VB0mv59*#H0l literal 0 HcmV?d00001 diff --git a/tests/classic.centroid.translation b/tests/classic.centroid.translation new file mode 100644 index 0000000000000000000000000000000000000000..c18d93725ecac80e675f9983b2f7a3aaa18901df GIT binary patch literal 4845 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 literal 0 HcmV?d00001 diff --git a/tests/classic.conf.translation b/tests/classic.conf.translation new file mode 100644 index 0000000000000000000000000000000000000000..9be95c63c2b0b4699817dfc216d7199d6d5af0ac GIT binary patch literal 4565 zcma)A3s6*L6kbgOUyKqeQa}R%K{4vYrBg%j43ic2+dSX z8AE(z=qM_YVF}}iFT|L_N+ZJuO-iXb4w2%h**X8-zs_vGO?NnZ&iU?lzH|Qn-o0Fi zel2>EPCGh*e_FHN;AbxI*fZ@pw&Xdk#4NWX(PMXJX;hu=DTo@1lOBh*Mo0e*{*Ryw zaDu^HHn%g|WwpgSoYq7~yvG^uw%W36x&V4ED>2ii!-`Cs+ntzdbL;#dVHGxA9|#vX zvRzQ^%68b?@y>-dm&=}P({+P0X^HN%cu!)I!=~#2X;QW|!{*Tde*oMbmpv=hE9kbm z>U15zo(E$+!o$Kudk}BTkR@3+3Au1QajQDRN!%v%XjW%d3JV57QUmrF4sgt4 zOpmS_9^`XA#3vuB<)gvtwOG~sWbhGMjM}qEjCl;?^T3h_o~Fev@QVnJd_3|5SUzAI zG`t9W3E}J_@m>;_LtF_~O)%6y4taxyT>#$%_LG+XqWMj+P$h z>$O+~KTeA$YJQsLqrktR#i%=<#F!^Tp5=orf_w?saZ6Vl9@ib94hp_O zc)UJ#u{&)H>DSNV--ORo-iO!Mp71L&6P(vC>vO2Ao#18L>mFAK`s>1H-Yg+JUf;iY zLfafN*NSbc&*SsmxBu9&8P|>w9#Gi&vy(T)FBjmQ@(){o7T_fA5a7oeUCSH-e0RXE!FvSwbouu8Jq3NEZtSY4 z7VJZ8Va%wZM2CN`UMlS0YY^dADs_HCh;C*`Z_^f%^ZhI7)%G&}j`qDz{F=M^1(H6U zAjTTgjsa!(UcmVapJ@-k-6r$a;AF?VBOzgGhaf64X9bP+w&+?8kQ@ z-iOy`)<-)zhTgUE%T;Fx4?;HQu#~>Fl>)r#?9nm!p2Rgc|6sXupHYBMIXFTYFTk%S zWt?0fm^;Eb_hBPhH`kB4ebR{U!oGd4_MByj7U(pWB;=12;H6EK5Ap?g?c2_;rwR1y zBUY4$iuk&lXC@FFLbh+y$97qJfaqMh@vY|&$@zK;gYPX}DcF~UEn7Eq66hX@yjQIf zo%(&Hb*D+r`&X^M-;D3de4p-&NK1Z>=<)s`OWXy)q@LsH_NvzI1n0Vu&vw0ZjNnt# z#|>{KeK>F6x!3o*2+!RzBOs6T$3Gqif;9l94>jub|M4kHcve-|r@;)dqMG1SG8z!q z8xb)|7)uJqdOWLG7*lV-SY;f8%y4ANW>k~lZ%62EW@@ZTG9Xh@SuefHVphd!%?jfy z*jF;3vQfc~MiXjEdh93}P|avTj%>!WlKfBnq?M``R8~#w)8OrnYN~~;#ekE@D$|h> zF|pZHJ)6yfd|72{_cF~4_pZXga0w?=WELxIPByd3_zF{2j94YHl}g^V8*w*G-m9as zDhn#eD%(}IQptiGqZ##$Y!XREMD}(u;LJu7+Y`2XGUF&Ry9zSv$kZfn?A2t~RAQ4$ z-tKH#@2*NFc3s#cl6U82wqxF_&(@+cj^bSlyK^KHawG|7Q_W1lglmz^h)C=@s_Y(6 qy{lupAv1l2?YVb{B{QyFVzsiKU3Z4a64L}Vf4HyldlU`-(D@79^0tZq literal 0 HcmV?d00001 diff --git a/tests/classic.csv b/tests/classic.csv new file mode 100644 index 0000000..708f0f0 --- /dev/null +++ b/tests/classic.csv @@ -0,0 +1,121 @@ +ms,bpm,dembow,fourfloor,density,flatness,centroid,regularity,highRatio,lowRatio,label,conf,f0_latin_dembow,f1_fourfloor,f2_tempo_latin,f3_low,f4_flat,f5_high,f6_density,f7_centroid,f8_reg,f9_regmid,f10_dyn,s_latin,s_electronic,s_hiphop,s_rock,s_classical +1004,0.000,0.000,0.000,3.125,0.061322,333.778,0.000,0.080008,0.000081,unknown,0.200,0.000,0.000,0.000,0.000,0.086,0.055,0.391,0.000,0.000,0.000,0.000,0.000,0.000,0.258,0.146,0.386 +2015,0.000,0.000,0.000,1.523,0.000345,1.877,0.000,0.000450,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.190,0.000,0.000,0.000,0.000,0.000,0.000,0.312,0.057,0.452 +3019,0.000,0.000,0.000,1.347,0.000002,0.011,0.536,0.000003,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.168,0.000,0.536,0.927,0.000,0.000,0.134,0.455,0.051,0.404 +4033,0.000,0.000,0.000,1.256,0.000000,0.000,0.496,0.000000,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.157,0.000,0.496,0.991,0.000,0.000,0.124,0.467,0.047,0.411 +5035,0.000,0.000,0.000,0.750,0.039351,523.073,0.000,0.421286,0.172807,unknown,0.200,0.000,0.000,0.000,0.273,0.040,0.675,0.094,0.007,0.000,0.000,0.000,0.068,0.041,0.217,0.238,0.274 +6049,98.030,0.000,0.000,4.500,0.024149,877.338,0.712,0.144162,0.304831,classical,0.430,0.000,0.000,0.000,0.566,0.009,0.171,0.563,0.108,0.712,0.577,1.000,0.392,0.263,0.474,0.248,0.587 +7049,98.034,0.000,0.000,3.000,0.013014,648.946,0.375,0.110104,0.059829,classical,0.650,0.000,0.000,0.000,0.022,0.000,0.109,0.375,0.043,0.375,0.750,1.000,0.255,0.097,0.444,0.156,0.686 +8063,97.784,0.000,0.000,5.750,0.022374,949.100,0.000,0.175541,0.021308,classical,0.618,0.000,0.000,0.000,0.000,0.005,0.228,0.719,0.128,0.000,0.000,1.000,0.250,0.000,0.231,0.317,0.602 +9067,97.868,0.000,0.000,7.250,0.022594,686.227,0.000,0.121620,0.131801,classical,0.567,0.000,0.000,0.000,0.182,0.005,0.130,0.906,0.053,0.000,0.000,1.000,0.295,0.027,0.253,0.325,0.584 +10080,97.917,0.000,0.000,10.000,0.016427,740.431,0.447,0.142132,0.339054,classical,0.321,0.000,0.000,0.000,0.642,0.000,0.168,1.000,0.069,0.447,0.893,1.000,0.411,0.208,0.451,0.367,0.505 +11093,97.917,0.000,0.000,7.750,0.008827,561.398,0.000,0.088407,0.055460,classical,0.602,0.000,0.000,0.000,0.012,0.000,0.070,0.969,0.018,0.000,0.000,1.000,0.253,0.002,0.222,0.316,0.587 +12096,97.931,0.000,0.000,3.500,0.010444,697.350,0.408,0.115244,0.261812,classical,0.523,0.000,0.000,0.000,0.471,0.000,0.119,0.438,0.056,0.408,0.816,1.000,0.368,0.173,0.530,0.181,0.664 +13109,97.920,0.000,0.000,5.250,0.011000,703.071,0.000,0.133925,0.153050,classical,0.635,0.000,0.000,0.000,0.229,0.000,0.153,0.656,0.058,0.000,0.000,1.000,0.307,0.034,0.307,0.257,0.640 +14110,122.422,0.000,0.190,8.250,0.009172,496.655,0.000,0.057272,0.358066,classical,0.507,0.000,0.190,0.000,0.685,0.000,0.013,1.000,0.000,0.000,0.000,1.000,0.171,0.419,0.284,0.304,0.596 +15123,122.686,0.000,0.223,13.250,0.006278,499.749,0.000,0.060614,0.067184,classical,0.598,0.000,0.223,0.000,0.038,0.000,0.019,1.000,0.000,0.000,0.000,1.000,0.010,0.334,0.153,0.306,0.594 +16125,98.568,0.000,0.230,10.750,0.023982,855.449,0.000,0.142623,0.100499,classical,0.509,0.000,0.230,0.000,0.112,0.008,0.168,1.000,0.102,0.000,0.000,1.000,0.278,0.097,0.207,0.377,0.549 +17138,98.857,0.000,0.218,11.250,0.014475,620.684,0.000,0.089700,0.104751,classical,0.562,0.000,0.218,0.000,0.122,0.000,0.072,1.000,0.034,0.000,0.000,1.000,0.280,0.095,0.231,0.330,0.578 +18150,99.053,0.000,0.222,10.250,0.013542,714.236,0.000,0.134646,0.125733,classical,0.514,0.000,0.222,0.000,0.168,0.000,0.154,1.000,0.061,0.000,0.000,1.000,0.292,0.103,0.218,0.361,0.554 +19153,99.044,0.000,0.237,8.250,0.006275,461.911,0.000,0.053247,0.103583,classical,0.593,0.000,0.237,0.000,0.119,0.000,0.006,1.000,0.000,0.000,0.000,1.000,0.280,0.101,0.245,0.302,0.598 +20165,99.044,0.000,0.246,8.750,0.007984,531.868,0.000,0.042467,0.104763,classical,0.480,0.000,0.246,0.000,0.122,0.000,0.000,1.000,0.009,0.000,0.000,0.738,0.280,0.104,0.247,0.302,0.508 +21167,99.039,0.000,0.239,9.500,0.006585,543.170,0.000,0.050090,0.154835,classical,0.334,0.000,0.239,0.000,0.233,0.000,0.000,1.000,0.012,0.000,0.000,0.433,0.308,0.119,0.270,0.303,0.402 +22172,99.039,0.000,0.237,8.500,0.008795,577.304,0.000,0.051923,0.122636,unknown,0.287,0.000,0.237,0.000,0.161,0.000,0.003,1.000,0.022,0.000,0.000,0.283,0.290,0.107,0.254,0.307,0.348 +23184,99.039,0.000,0.217,7.500,0.015380,786.163,0.000,0.113428,0.038068,rock,0.307,0.000,0.217,0.000,0.000,0.000,0.115,0.938,0.082,0.000,0.000,0.179,0.250,0.076,0.207,0.336,0.294 +24244,98.947,0.000,0.232,8.000,0.007492,652.794,0.000,0.087718,0.005156,rock,0.312,0.000,0.232,0.000,0.000,0.000,0.069,1.000,0.044,0.000,0.000,0.103,0.250,0.081,0.207,0.331,0.266 +25256,98.786,0.000,0.245,8.750,0.013626,762.278,0.000,0.124556,0.037949,rock,0.360,0.000,0.245,0.000,0.000,0.000,0.136,1.000,0.075,0.000,0.000,0.052,0.250,0.086,0.191,0.359,0.228 +26259,98.542,0.000,0.231,9.500,0.006000,1297.760,0.000,0.331577,0.022301,rock,0.606,0.000,0.231,0.000,0.000,0.000,0.512,1.000,0.228,0.000,0.000,0.031,0.250,0.081,0.098,0.511,0.107 +27270,98.374,0.000,0.244,8.500,0.007808,751.478,0.000,0.131256,0.055057,rock,0.364,0.000,0.244,0.000,0.011,0.000,0.148,1.000,0.072,0.000,0.000,0.039,0.253,0.087,0.193,0.362,0.219 +28283,98.346,0.000,0.251,10.000,0.014947,1337.281,0.000,0.275495,0.135953,rock,0.514,0.000,0.251,0.000,0.191,0.000,0.410,1.000,0.239,0.000,0.000,0.054,0.298,0.117,0.163,0.483,0.146 +29283,98.370,0.000,0.248,8.500,0.016143,2521.022,0.000,0.620861,0.066173,rock,0.854,0.000,0.248,0.000,0.036,0.000,1.000,1.000,0.577,0.000,0.000,0.071,0.259,0.092,-0.015,0.744,-0.025 +30283,98.277,0.000,0.239,6.500,0.012478,724.830,0.000,0.114668,0.071013,unknown,0.251,0.000,0.239,0.000,0.047,0.000,0.118,0.813,0.064,0.000,0.000,0.096,0.262,0.091,0.246,0.295,0.295 +31293,98.191,0.000,0.244,6.250,0.004110,339.673,0.000,0.038890,0.013710,classical,0.319,0.000,0.244,0.000,0.000,0.000,0.000,0.781,0.000,0.000,0.000,0.122,0.250,0.086,0.272,0.234,0.347 +32294,98.140,0.000,0.271,7.250,0.007121,546.270,0.000,0.088478,0.064826,unknown,0.255,0.000,0.271,0.000,0.033,0.000,0.070,0.906,0.013,0.000,0.000,0.131,0.258,0.100,0.237,0.296,0.298 +33306,98.091,0.000,0.242,9.500,0.007229,499.780,0.000,0.072822,0.079403,unknown,0.273,0.000,0.242,0.000,0.065,0.000,0.041,1.000,0.000,0.000,0.000,0.131,0.266,0.095,0.232,0.312,0.283 +34321,98.063,0.000,0.261,9.500,0.012931,746.717,0.000,0.111006,0.122510,rock,0.308,0.000,0.261,0.000,0.161,0.000,0.111,1.000,0.070,0.000,0.000,0.134,0.290,0.116,0.234,0.351,0.264 +35335,98.043,0.000,0.251,10.000,0.005499,636.391,0.000,0.108008,0.063769,rock,0.317,0.000,0.251,0.000,0.031,0.000,0.105,1.000,0.039,0.000,0.000,0.144,0.258,0.092,0.209,0.341,0.269 +36336,98.030,0.000,0.237,8.750,0.006635,768.991,0.000,0.122391,0.289401,unknown,0.291,0.000,0.237,0.000,0.532,0.000,0.132,1.000,0.077,0.000,0.000,0.144,0.383,0.163,0.303,0.359,0.261 +37348,97.910,0.000,0.242,7.000,0.007505,1397.054,0.000,0.327693,0.165552,rock,0.485,0.000,0.242,0.000,0.257,0.000,0.505,0.875,0.256,0.000,0.000,0.144,0.314,0.123,0.181,0.478,0.180 +38353,97.951,0.000,0.216,8.000,0.005131,608.813,0.000,0.135939,0.069241,rock,0.341,0.000,0.216,0.000,0.043,0.000,0.156,1.000,0.031,0.000,0.000,0.134,0.261,0.082,0.200,0.355,0.250 +39353,97.862,0.000,0.228,8.250,0.012774,1044.094,0.000,0.241191,0.019678,rock,0.485,0.000,0.228,0.000,0.000,0.000,0.348,1.000,0.155,0.000,0.000,0.149,0.250,0.080,0.144,0.443,0.198 +40368,97.890,0.000,0.245,9.500,0.371500,5132.645,0.082,0.968539,0.002507,unknown,0.200,0.000,0.245,0.000,0.000,0.732,1.000,1.000,1.000,0.082,0.163,0.221,0.250,0.106,0.005,0.960,0.019 +41369,97.791,0.000,0.235,9.500,0.881606,5061.612,0.378,0.990216,0.001809,unknown,0.200,0.000,0.235,0.000,0.000,1.000,1.000,1.000,1.000,0.378,0.755,1.000,0.250,0.177,0.095,1.000,0.262 +42383,97.919,0.000,0.222,5.750,0.019691,253.064,0.580,0.027891,0.592308,unknown,0.200,0.000,0.222,0.000,1.000,0.000,0.000,0.719,0.000,0.580,0.840,1.000,0.500,0.373,0.613,0.216,0.612 +43392,97.956,0.000,0.227,1.750,0.079951,630.531,0.387,0.072890,0.494349,unknown,0.200,0.000,0.227,0.000,0.987,0.125,0.042,0.219,0.037,0.387,0.773,1.000,0.497,0.324,0.690,0.106,0.744 +44407,97.972,0.000,0.236,4.000,0.027850,724.776,0.000,0.031961,0.191943,classical,0.694,0.000,0.236,0.000,0.315,0.016,0.000,0.500,0.064,0.000,0.000,1.000,0.329,0.130,0.393,0.169,0.725 +45408,97.980,0.000,0.225,6.000,0.050824,861.395,0.000,0.061264,0.058481,classical,0.674,0.000,0.225,0.000,0.019,0.064,0.020,0.750,0.103,0.000,0.000,1.000,0.255,0.082,0.279,0.267,0.656 +46409,98.096,0.000,0.206,7.250,0.056042,820.527,0.000,0.066464,0.084772,classical,0.610,0.000,0.206,0.000,0.077,0.075,0.030,0.906,0.092,0.000,0.000,1.000,0.269,0.084,0.256,0.315,0.614 +47422,98.221,0.000,0.187,6.750,0.036285,582.518,0.000,0.043044,0.193740,classical,0.608,0.000,0.187,0.000,0.319,0.034,0.000,0.844,0.024,0.000,0.000,1.000,0.330,0.113,0.324,0.264,0.639 +48437,98.308,0.000,0.178,5.750,0.019782,917.314,0.000,0.025185,0.030469,classical,0.697,0.000,0.178,0.000,0.000,0.000,0.000,0.719,0.119,0.000,0.000,1.000,0.250,0.062,0.284,0.245,0.670 +49452,98.359,0.000,0.209,6.000,0.018166,1146.549,0.000,0.264151,0.007861,classical,0.516,0.000,0.209,0.000,0.000,0.000,0.389,0.750,0.185,0.000,0.000,1.000,0.250,0.073,0.180,0.388,0.546 +50465,98.367,0.105,0.162,7.500,0.036312,733.273,0.000,0.111132,0.308805,classical,0.461,0.105,0.162,0.000,0.575,0.034,0.111,0.938,0.067,0.000,0.000,1.000,0.446,0.143,0.312,0.336,0.582 +51479,73.646,0.167,0.014,7.000,0.041625,1236.936,0.000,0.302169,0.043854,classical,0.447,0.167,0.014,0.000,0.000,0.045,0.458,0.875,0.211,0.000,0.000,1.000,0.144,0.005,0.093,0.459,0.494 +52490,73.530,0.187,0.008,1.750,0.031035,702.669,0.611,0.080966,0.053999,classical,0.706,0.187,0.008,0.000,0.009,0.023,0.056,0.219,0.058,0.611,0.777,1.000,0.154,0.157,0.439,0.100,0.717 +53493,98.028,0.070,0.058,3.750,0.042029,765.451,0.437,0.111460,0.052959,classical,0.604,0.070,0.058,0.000,0.007,0.046,0.112,0.469,0.076,0.437,0.874,1.000,0.287,0.130,0.430,0.200,0.656 +54494,98.019,0.000,0.171,5.250,0.040401,812.126,0.314,0.116077,0.030856,classical,0.590,0.000,0.171,0.000,0.000,0.043,0.120,0.656,0.089,0.314,0.628,1.000,0.250,0.138,0.363,0.262,0.619 +55508,97.879,0.000,0.192,7.750,0.041553,815.356,0.341,0.128955,0.037727,classical,0.465,0.000,0.192,0.000,0.000,0.045,0.144,0.969,0.090,0.341,0.682,1.000,0.250,0.153,0.303,0.363,0.531 +56520,97.762,0.000,0.196,7.250,0.036986,721.973,0.325,0.101986,0.030788,classical,0.516,0.000,0.196,0.000,0.000,0.035,0.095,0.906,0.063,0.325,0.650,1.000,0.250,0.150,0.324,0.321,0.563 +57532,97.681,0.000,0.212,7.000,0.006120,441.902,0.404,0.017280,0.178052,classical,0.484,0.000,0.212,0.000,0.285,0.000,0.000,0.875,0.000,0.404,0.809,1.000,0.321,0.218,0.435,0.263,0.591 +58541,97.625,0.000,0.188,7.000,0.043900,904.930,0.000,0.158110,0.052161,classical,0.560,0.000,0.188,0.000,0.005,0.050,0.197,0.875,0.116,0.000,0.000,1.000,0.251,0.066,0.209,0.358,0.572 +59541,97.559,0.000,0.185,5.000,0.060172,1113.703,0.000,0.200810,0.027586,classical,0.615,0.000,0.185,0.000,0.000,0.084,0.274,0.625,0.175,0.000,0.000,1.000,0.250,0.065,0.239,0.326,0.611 +60553,97.879,0.000,0.251,7.500,0.040733,913.016,0.000,0.156284,0.033432,classical,0.533,0.000,0.251,0.000,0.000,0.043,0.193,0.938,0.118,0.000,0.000,1.000,0.250,0.088,0.195,0.375,0.558 +61566,98.382,0.000,0.217,7.250,0.037884,780.987,0.108,0.137164,0.039326,classical,0.545,0.000,0.217,0.000,0.000,0.037,0.158,0.906,0.080,0.108,0.217,1.000,0.250,0.103,0.239,0.345,0.565 +62578,98.622,0.000,0.255,7.250,0.038590,795.831,0.105,0.118986,0.047799,classical,0.558,0.000,0.255,0.000,0.000,0.039,0.125,0.906,0.085,0.105,0.210,1.000,0.250,0.116,0.245,0.336,0.575 +63580,98.872,0.000,0.217,7.500,0.046989,1322.181,0.161,0.274019,0.010562,classical,0.373,0.000,0.217,0.000,0.000,0.056,0.407,0.938,0.235,0.161,0.321,1.000,0.250,0.116,0.183,0.471,0.477 +64584,99.067,0.000,0.208,6.500,0.043714,839.682,0.000,0.117523,0.067015,classical,0.616,0.000,0.208,0.000,0.038,0.049,0.123,0.813,0.097,0.000,0.000,1.000,0.259,0.079,0.237,0.312,0.610 +65598,99.106,0.000,0.226,8.000,0.044190,780.945,0.000,0.098368,0.061774,classical,0.561,0.000,0.226,0.000,0.026,0.050,0.088,1.000,0.080,0.000,0.000,1.000,0.257,0.083,0.206,0.354,0.574 +66611,99.078,0.000,0.215,8.250,0.048174,854.232,0.000,0.124958,0.093759,classical,0.524,0.000,0.215,0.000,0.097,0.059,0.136,1.000,0.101,0.000,0.000,1.000,0.274,0.090,0.208,0.375,0.559 +67623,99.061,0.000,0.218,9.250,0.029645,627.516,0.124,0.072281,0.040430,classical,0.314,0.000,0.218,0.000,0.000,0.020,0.041,1.000,0.036,0.124,0.247,0.408,0.250,0.107,0.250,0.324,0.368 +68635,99.057,0.000,0.230,6.000,0.053197,1083.410,0.029,0.167699,0.056714,rock,0.306,0.000,0.230,0.000,0.015,0.069,0.214,0.750,0.167,0.029,0.057,0.116,0.254,0.090,0.231,0.341,0.286 +69646,98.883,0.000,0.212,6.750,0.049802,914.430,0.021,0.148538,0.030747,rock,0.322,0.000,0.212,0.000,0.000,0.062,0.179,0.844,0.118,0.021,0.043,0.113,0.250,0.080,0.217,0.346,0.273 +70646,98.880,0.000,0.230,7.750,0.070950,1742.675,0.166,0.422216,0.029789,rock,0.700,0.000,0.230,0.000,0.000,0.106,0.677,0.969,0.355,0.166,0.332,0.113,0.250,0.122,0.111,0.598,0.078 +71659,98.917,0.000,0.221,5.750,0.064900,1038.989,0.091,0.149649,0.073738,unknown,0.268,0.000,0.221,0.000,0.053,0.094,0.181,0.719,0.154,0.091,0.182,0.102,0.263,0.108,0.273,0.323,0.293 +72671,98.943,0.000,0.213,8.500,0.046567,970.091,0.000,0.132740,0.009896,rock,0.395,0.000,0.213,0.000,0.000,0.055,0.150,1.000,0.134,0.000,0.000,0.067,0.250,0.075,0.186,0.387,0.228 +73671,98.961,0.000,0.236,6.750,0.070808,1342.344,0.000,0.239446,0.043884,rock,0.469,0.000,0.236,0.000,0.000,0.106,0.344,0.844,0.241,0.000,0.000,0.000,0.250,0.083,0.169,0.433,0.186 +74672,98.974,0.000,0.206,8.250,0.082026,1268.893,0.246,0.239283,0.051134,rock,0.517,0.000,0.206,0.000,0.003,0.129,0.344,1.000,0.220,0.246,0.492,0.000,0.251,0.134,0.212,0.478,0.122 +75683,99.089,0.000,0.224,7.500,0.070693,1051.333,0.210,0.163545,0.052211,rock,0.392,0.000,0.224,0.000,0.005,0.106,0.206,0.938,0.158,0.210,0.421,0.000,0.251,0.132,0.248,0.398,0.183 +76696,99.020,0.000,0.240,6.500,0.067145,885.090,0.226,0.133951,0.067109,unknown,0.283,0.000,0.240,0.000,0.038,0.098,0.153,0.813,0.110,0.226,0.452,0.000,0.260,0.146,0.298,0.332,0.228 +77696,99.014,0.000,0.215,4.000,0.065444,873.480,0.000,0.140001,0.056694,unknown,0.290,0.000,0.215,0.000,0.015,0.095,0.164,0.500,0.107,0.000,0.000,0.000,0.254,0.078,0.285,0.240,0.326 +78696,99.010,0.000,0.242,3.750,0.077847,1456.184,0.000,0.290221,0.039008,rock,0.342,0.000,0.242,0.000,0.000,0.121,0.437,0.469,0.273,0.000,0.000,0.000,0.250,0.085,0.220,0.358,0.252 +79697,99.006,0.000,0.221,3.500,0.076802,1836.423,0.000,0.391417,0.021519,rock,0.458,0.000,0.221,0.000,0.000,0.118,0.621,0.438,0.382,0.000,0.000,0.000,0.250,0.077,0.181,0.431,0.204 +80710,99.004,0.000,0.229,3.250,0.082999,1490.978,0.000,0.283795,0.020664,rock,0.311,0.000,0.229,0.000,0.000,0.131,0.425,0.406,0.283,0.000,0.000,0.000,0.250,0.080,0.236,0.340,0.271 +81724,98.693,0.000,0.235,3.250,0.067662,1107.044,0.000,0.200096,0.023994,unknown,0.277,0.000,0.235,0.000,0.000,0.099,0.273,0.406,0.173,0.000,0.000,0.000,0.250,0.082,0.276,0.262,0.317 +82724,98.556,0.000,0.244,4.250,0.072169,968.190,0.000,0.183290,0.030618,unknown,0.254,0.000,0.244,0.000,0.000,0.109,0.242,0.531,0.134,0.000,0.000,0.000,0.250,0.085,0.259,0.282,0.294 +83737,98.457,0.000,0.242,6.750,0.079156,1376.102,0.000,0.255929,0.026187,rock,0.490,0.000,0.242,0.000,0.000,0.123,0.374,0.844,0.250,0.000,0.000,0.000,0.250,0.085,0.165,0.447,0.177 +84751,98.422,0.000,0.230,5.250,0.067359,1774.435,0.000,0.375321,0.013163,rock,0.543,0.000,0.230,0.000,0.000,0.099,0.591,0.656,0.364,0.000,0.000,0.000,0.250,0.081,0.148,0.480,0.158 +85764,98.435,0.000,0.239,6.000,0.081163,1406.010,0.000,0.254591,0.014967,rock,0.444,0.000,0.239,0.000,0.000,0.127,0.372,0.750,0.259,0.000,0.000,0.000,0.250,0.084,0.184,0.420,0.201 +86778,98.391,0.000,0.229,6.250,0.066903,1099.889,0.000,0.194961,0.053704,rock,0.369,0.000,0.229,0.000,0.008,0.098,0.264,0.781,0.171,0.000,0.000,0.000,0.252,0.081,0.207,0.371,0.226 +87792,98.270,0.000,0.229,5.500,0.086023,1113.192,0.000,0.209291,0.053777,rock,0.344,0.000,0.229,0.000,0.008,0.138,0.290,0.688,0.175,0.000,0.000,0.000,0.252,0.081,0.220,0.358,0.241 +88806,98.186,0.000,0.251,7.250,0.056165,779.682,0.047,0.121704,0.074862,rock,0.317,0.000,0.251,0.000,0.055,0.075,0.130,0.906,0.080,0.047,0.094,0.000,0.264,0.108,0.240,0.342,0.230 +89809,98.091,0.000,0.222,5.000,0.067502,826.405,0.265,0.131410,0.073777,hiphop,0.302,0.000,0.222,0.000,0.053,0.099,0.148,0.625,0.093,0.265,0.530,0.024,0.263,0.152,0.357,0.270,0.281 +90823,98.068,0.003,0.230,4.750,0.028568,759.858,0.000,0.081706,0.073314,classical,0.315,0.003,0.230,0.000,0.052,0.018,0.058,0.594,0.074,0.000,0.000,0.062,0.264,0.088,0.306,0.217,0.356 +91834,98.142,0.030,0.223,7.500,0.030628,716.241,0.000,0.104891,0.071259,rock,0.300,0.030,0.223,0.000,0.047,0.022,0.100,0.938,0.062,0.000,0.000,0.056,0.277,0.085,0.222,0.330,0.255 +92846,98.297,0.000,0.241,6.500,0.041704,822.473,0.000,0.119826,0.072315,unknown,0.273,0.000,0.241,0.000,0.050,0.045,0.127,0.813,0.092,0.000,0.000,0.051,0.262,0.092,0.244,0.312,0.277 +93860,98.368,0.007,0.242,6.500,0.043870,810.094,0.000,0.134532,0.044193,unknown,0.291,0.007,0.242,0.000,0.000,0.050,0.154,0.813,0.089,0.000,0.000,0.053,0.253,0.085,0.226,0.319,0.269 +94873,98.409,0.000,0.269,8.000,0.049984,866.452,0.000,0.123156,0.015955,rock,0.376,0.000,0.269,0.000,0.000,0.062,0.133,1.000,0.105,0.000,0.000,0.051,0.250,0.094,0.194,0.375,0.228 +95886,98.437,0.000,0.252,9.000,0.052941,973.247,0.374,0.180377,0.044510,rock,0.395,0.000,0.252,0.000,0.000,0.069,0.237,1.000,0.135,0.374,0.748,0.038,0.250,0.182,0.280,0.415,0.155 +96892,98.457,0.000,0.268,9.000,0.036364,917.881,0.223,0.147049,0.031483,rock,0.373,0.000,0.268,0.000,0.000,0.034,0.176,1.000,0.119,0.223,0.447,0.050,0.250,0.150,0.250,0.388,0.192 +97905,98.339,0.000,0.248,7.750,0.049250,829.444,0.271,0.137068,0.023268,rock,0.340,0.000,0.248,0.000,0.000,0.061,0.158,0.969,0.094,0.271,0.542,0.053,0.250,0.155,0.276,0.371,0.202 +98905,98.234,0.000,0.247,7.000,0.117592,1851.130,0.315,0.382080,0.004831,rock,0.635,0.000,0.247,0.000,0.000,0.203,0.604,0.875,0.386,0.315,0.631,0.046,0.250,0.165,0.197,0.571,0.085 +99905,98.161,0.000,0.246,4.500,0.063859,1805.919,0.000,0.448536,0.012620,rock,0.561,0.000,0.246,0.000,0.000,0.091,0.725,0.563,0.373,0.000,0.000,0.053,0.250,0.086,0.135,0.493,0.161 +100907,98.111,0.000,0.206,4.000,0.043859,2445.386,0.000,0.559094,0.017351,rock,0.676,0.000,0.206,0.000,0.000,0.050,0.926,0.500,0.556,0.000,0.000,0.086,0.250,0.072,0.098,0.574,0.127 +101920,98.102,0.000,0.226,4.750,0.048489,1951.290,0.000,0.379895,0.000308,rock,0.514,0.000,0.226,0.000,0.000,0.059,0.600,0.594,0.415,0.000,0.000,0.086,0.250,0.079,0.161,0.471,0.202 +102921,98.148,0.000,0.208,4.250,0.039109,1515.642,0.000,0.286703,0.000072,rock,0.350,0.000,0.208,0.000,0.000,0.040,0.430,0.531,0.290,0.000,0.000,0.082,0.250,0.073,0.215,0.367,0.267 +103923,98.148,0.000,0.222,4.750,0.041030,1654.072,0.230,0.290009,0.000099,rock,0.370,0.000,0.222,0.000,0.000,0.044,0.436,0.594,0.330,0.230,0.460,0.092,0.250,0.135,0.270,0.398,0.230 +104934,78.354,0.000,0.000,3.500,0.019290,1737.739,0.336,0.309386,0.000019,rock,0.332,0.000,0.000,0.000,0.000,0.000,0.472,0.438,0.354,0.336,0.672,0.085,0.139,0.084,0.334,0.361,0.245 +105946,77.962,0.000,0.000,3.000,0.046700,2426.534,0.121,0.584411,0.000056,rock,0.686,0.000,0.000,0.000,0.000,0.056,0.972,0.375,0.550,0.121,0.241,0.071,0.133,0.030,0.155,0.550,0.128 +106961,77.819,0.000,0.000,3.000,0.033641,1456.426,0.000,0.358588,0.000083,rock,0.375,0.000,0.000,0.000,0.000,0.028,0.561,0.375,0.273,0.000,0.000,0.088,0.130,0.000,0.220,0.353,0.269 +107961,77.692,0.000,0.000,2.750,0.036084,1130.360,0.000,0.197410,0.000041,classical,0.382,0.000,0.000,0.000,0.000,0.034,0.268,0.344,0.180,0.000,0.000,0.119,0.128,0.000,0.299,0.234,0.375 +108975,77.692,0.000,0.000,4.000,0.031522,1286.931,0.065,0.299218,0.000022,rock,0.355,0.000,0.000,0.000,0.000,0.024,0.453,0.500,0.225,0.065,0.129,0.119,0.128,0.016,0.241,0.346,0.274 +109986,75.894,0.000,0.000,4.750,0.046605,1857.822,0.000,0.417767,0.000030,rock,0.607,0.000,0.000,0.000,0.000,0.055,0.669,0.594,0.388,0.000,0.000,0.129,0.098,0.000,0.137,0.484,0.196 +110994,75.750,0.000,0.000,3.000,0.026657,2881.627,0.000,0.515009,0.000041,rock,0.669,0.000,0.000,0.000,0.000,0.014,0.845,0.375,0.680,0.000,0.000,0.139,0.096,0.000,0.135,0.538,0.201 +112005,75.533,0.000,0.000,1.750,0.026818,2235.027,0.000,0.512930,0.000131,rock,0.524,0.000,0.000,0.000,0.000,0.014,0.842,0.219,0.496,0.000,0.000,0.164,0.092,0.000,0.166,0.444,0.250 +113018,75.170,0.000,0.000,1.500,0.031214,1294.026,0.000,0.191054,0.000775,classical,0.473,0.000,0.000,0.000,0.000,0.023,0.256,0.188,0.227,0.000,0.000,0.182,0.086,0.000,0.316,0.193,0.440 +114018,74.962,0.000,0.000,1.750,0.025372,974.089,0.000,0.109181,0.000113,classical,0.547,0.000,0.000,0.000,0.000,0.011,0.108,0.219,0.135,0.000,0.000,0.250,0.083,0.000,0.346,0.133,0.500 +115032,93.629,0.008,0.124,3.500,0.019817,770.121,0.000,0.058018,0.000038,classical,0.465,0.008,0.124,0.000,0.000,0.000,0.015,0.438,0.077,0.000,0.000,0.279,0.254,0.043,0.358,0.155,0.484 +116045,94.164,0.009,0.178,5.000,0.030624,864.348,0.000,0.097070,0.000088,classical,0.389,0.009,0.178,0.000,0.000,0.022,0.086,0.625,0.104,0.000,0.000,0.290,0.254,0.062,0.302,0.243,0.420 +117059,94.677,0.000,0.204,6.000,0.038831,671.875,0.000,0.091924,0.017081,classical,0.375,0.000,0.204,0.000,0.000,0.039,0.076,0.750,0.049,0.000,0.000,0.336,0.250,0.071,0.281,0.266,0.407 +118061,75.849,0.000,0.198,6.750,0.033419,703.828,0.000,0.075623,0.013355,classical,0.403,0.000,0.198,0.000,0.000,0.028,0.047,0.844,0.058,0.000,0.000,0.336,0.097,0.069,0.242,0.286,0.393 +119071,75.837,0.000,0.185,7.250,0.033306,577.178,0.000,0.069195,0.051841,classical,0.389,0.000,0.185,0.000,0.004,0.028,0.035,0.906,0.022,0.000,0.000,0.336,0.098,0.065,0.233,0.292,0.381 +120086,75.798,0.000,0.208,5.250,0.050438,770.684,0.000,0.116150,0.031022,classical,0.436,0.000,0.208,0.000,0.000,0.063,0.120,0.656,0.077,0.000,0.000,0.337,0.097,0.073,0.261,0.262,0.418 +121093,75.861,0.000,0.201,5.000,0.067920,1160.512,0.000,0.177743,0.061046,classical,0.382,0.000,0.201,0.000,0.025,0.100,0.232,0.625,0.189,0.000,0.000,0.337,0.104,0.074,0.244,0.319,0.392 diff --git a/tests/classic.csv.import b/tests/classic.csv.import new file mode 100644 index 0000000..0747db9 --- /dev/null +++ b/tests/classic.csv.import @@ -0,0 +1,19 @@ +[remap] + +importer="csv_translation" +type="Translation" +uid="uid://cjhbh0w1lnyvu" + +[deps] + +files=["res://tests/classic.bpm.translation", "res://tests/classic.dembow.translation", "res://tests/classic.fourfloor.translation", "res://tests/classic.density.translation", "res://tests/classic.flatness.translation", "res://tests/classic.centroid.translation", "res://tests/classic.regularity.translation", "res://tests/classic.highRatio.translation", "res://tests/classic.lowRatio.translation", "res://tests/classic.label.translation", "res://tests/classic.conf.translation", "res://tests/classic.f0.translation", "res://tests/classic.f1.translation", "res://tests/classic.f2.translation", "res://tests/classic.f3.translation", "res://tests/classic.f4.translation", "res://tests/classic.f5.translation", "res://tests/classic.f6.translation", "res://tests/classic.f7.translation", "res://tests/classic.f8.translation", "res://tests/classic.f9.translation", "res://tests/classic.f10.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation"] + +source_file="res://tests/classic.csv" +dest_files=["res://tests/classic.bpm.translation", "res://tests/classic.dembow.translation", "res://tests/classic.fourfloor.translation", "res://tests/classic.density.translation", "res://tests/classic.flatness.translation", "res://tests/classic.centroid.translation", "res://tests/classic.regularity.translation", "res://tests/classic.highRatio.translation", "res://tests/classic.lowRatio.translation", "res://tests/classic.label.translation", "res://tests/classic.conf.translation", "res://tests/classic.f0.translation", "res://tests/classic.f1.translation", "res://tests/classic.f2.translation", "res://tests/classic.f3.translation", "res://tests/classic.f4.translation", "res://tests/classic.f5.translation", "res://tests/classic.f6.translation", "res://tests/classic.f7.translation", "res://tests/classic.f8.translation", "res://tests/classic.f9.translation", "res://tests/classic.f10.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation", "res://tests/classic.s.translation"] + +[params] + +compress=1 +delimiter=0 +unescape_keys=false +unescape_translations=true diff --git a/tests/classic.dembow.translation b/tests/classic.dembow.translation new file mode 100644 index 0000000000000000000000000000000000000000..0dace67b12210bd1e8630b4720d7ab44ecc73910 GIT binary patch literal 4567 zcmeHLeNa?Y6n`4ThrlQyu9S$1pk}ZLEMI1ZAA?AUq!f$^%kG0+++}Isf(}E7jOd1D zDkcmes1Z5}N<>(~IHD+GOkt&=p+b{VVvIwiIBIt8c5idqZd3m?)AWYlo^yWhcRudj z_Z|=8UyffO(8C7olN95@F3U1$_1aufy~3!>lypjy){sf1g75@*(>gB~dM9Ns|DF5? zjss|90HY`wvW+S+S!Ylwb;%|}vZN9-MZpE1%T($`fn?}KNm8bZl3)jcB|{Y4!OhZT z8zI}6trMkWLyl-PYSp4J2F_@dk|x=tOx1~kGlZ$xsx_jC681nyCZjep{kMXW%BamU z0VxQh0Mh`L9^wA}ygf(`Qm6yw2n&c7j=$V0TR2I!iC8kXTGXc+)>=X@2wMS<;Q(W? z#K(st<=w2#dsxNZG@b=kPJIQn3&BQHpVW>+K8X_`UIj=+yoUNlu+-UetNNf+*6(FNA z(@ceU2Ic&y4FVfZeWt^9KAejN#8FKGwX49UQlIEG;Aa9%h|2}P0L8d2@i)^F-^ErOr4xnn;=Jj>U;`}(6;ly8o3ze>I{>-;oD zWK|N=r>N-^A5Q-SRL{hAUT(Z8n<{Le)8$Ao9-|S)1`>R6ZfK+tiF$2*Vgq*D?ZA(f_S!Xt)<&$ z%|(69GfOq2kq%tT+==@fRNIk`<$naw@liFuM{ zHtIJq%)W;_Pgx(9-+tPzEEMr9e}j8t?Fiy)_jWvP;Pe;5mkm@R9m}88H-C5qnyaX4 z%SG~hx9%SivF65cqyvd%{n_f>$s0Mmjro}BI}ZQsNb1lpoceX;MG1~*ZZ==L^F`Mb zRHuK`cBk`5$L9F?dV8)9r|yO6GtcCse5SvCcKE#@PM!2iffW@Tec@x@IH3QuFWvdI zjk`E?)-P_&-ObV4-RNIl%;8UV8#m}U`~jEhDF-?HlAyt_$8!3{-l}eB;p{_VNy1ET zREOPH&zDRZ=Y{l5!5wx}QC+>q_>giGv;C_aH~a$m9c_J`*!4NuxuQNc;FFw?eV(=C zy@2U+o*Ho>zb{$rT<3E;55-GuU#qG?G3%Q+=0HXahu^=eJ0XL^_ZQB4={D*M63aX> zt*7kCyAkW(Q8ckToRe?9meg_wt%v0g4tQL2L-}dJZX=61`ORSgb>v-$^O&q@Y{E6A*J&Dy|`lI!R!*e+NqNBdS^Emv?)HQ8coVlY7 zD<5{Fb+h`hgKcxjyRdcN-m!6E@tit+l_};K9KNQf>4BNUx34vP9>uBO8C_KG$I}Y~ z=jJ0GT+6;KiE!9<1l75E>q}E3irIQfWcSu@;_ORG`JSCNoVv$j?zJdTozBBG9cNL@ z`Zw>m-$&k+**@Lz)u^9A^;mz8e5qK5@)@6@Z60z$JgXb?wByy2h+mvB*JlXzVYn2&adi}u@C?N literal 0 HcmV?d00001 diff --git a/tests/classic.density.translation b/tests/classic.density.translation new file mode 100644 index 0000000000000000000000000000000000000000..6a390cdfb7ef969142f428e268d3b348b8fcea78 GIT binary patch literal 4576 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 ZC>f7D%=(E(^+(?k_BDBq;^5yozXGyXu~Gm4 literal 0 HcmV?d00001 diff --git a/tests/classic.f1.translation b/tests/classic.f1.translation new file mode 100644 index 0000000000000000000000000000000000000000..4970706d84cea9c49b9f220a3e5bc6e53e38a32b GIT binary patch literal 4563 zcmb_g4Nz276n+}SkH{z?A}Rjle}?-Wy9=vU=HDO^Dk%kH;<7y0)rF0-QsoD_m3)7vJR7<9uw8U;qb6AZ|i!Dv13c?c*U5Xw)JgGoR{S*8b zffsNB!R)fbmSH!^309lQXiae15*#KuO%{CdTADFc7Dz>^>~I)UWQX7Z39XQY00`5q z8Fr|)XIN!Nf^D^Iw_B2AVF0X{jSh2y)0k+Lg@KSJW|&sVP8IM3z~Qu8(oz&bhskb9 zcLFE~{lK09qdlfgoywa*LSlxb%MfN0E*$?jDtA~UV`4s8q~R!l8o(aI0gieS%q2wk;ly_uwsbeM@wW|~d-od-9&)UzgWT7y`bDLmtiFtJHn)bN zEt6-UzWI}i%>5A$Lb~s`Jzl1*h{x(b62HGb3*q5Q5BSgF)L)2r?om6!S$&pIyMHpO zPs#Z>irj0i`w!f@arQw}&-S(X^qIN7JX{|;fjmcDb>5viweuPWZ!0oYe#+_lpy5i} zK92t7hlSf#bNKPKePxXZXZK6>{a^M6qrNAXhrYcR<#i>NV)E>8-EW|~@vTav$FBRs z-ZjnaJ4b35zWAl`Ci2{J)!F129Z$Z~42O``Xxy#iThKmo$28l=WftO{YDI!x7Hv*9Fv6_947-ck|Ig!LTUE&rJ5M-KjMUt-Vi9R0&3d9mJT-)w(P z126imKsufMw)&h$JhqSDt~X_l=jdJ-H|b0^s%QM`XL~=;a&%HIg_f3b__>cKECTp% zb7{-2tl7cQSv#*Gb0>%IaieqbCJuhG&A!gc!T0;_8-0L-&)0T;JBZUa`qsYcdd?i; z3S%dYMLO(z^?c!o!J`nrR@dw?2I-~-4GAkjIh$YE;NBO>?`YTi#G}L8!w>awgP7EW z?Fp_V?*)v%`l&u&^81qI0}qeCorUrR?yr|upq%xM8?b+66bIkCqb+tN2k*>%;pN+? zFHq=yq8d(ll6NE4zd3JM+cZvn{5D!AS&vD5^n`$|D-T4z!$a@mgVEm(1wnGvJpL=wI?gb8hGjUa8 zI%nUJwxti-&~-EY=o!JFQ+eHp>gZ;8yS z3gPjEu5&XH4k4Y}{OMj>jv$?@x4w4PpqyP#Vc@;B8#r@WQL<~h8%Ote)V+E=(rGzV z(R>!=tbg6M`yJ$6na%0W1as1Gq{sRPWji(nqI!m}wAA(ZAe`w&J?(wIq*XlD--Z!8JN^7U>>D16dUfR7a$7I9&~=n#!(}Yt&IhiK&hx zDOCziJF0V|J5*wcUY)2+mGbF6C5g^KtIU}yXla$gmy`)BxWYu5$|Mzza#r@KOh)ZX zJ8JQqsiuzV=;>~?%2}B?-kTEBRjT=4?lh5JDf>jowTK3yEGiRLCaDnxPq?qi_b3Mb Go%07eh_Y<} literal 0 HcmV?d00001 diff --git a/tests/classic.f10.translation b/tests/classic.f10.translation new file mode 100644 index 0000000000000000000000000000000000000000..27288c002911b9fe76e9badbdfc9332e34842528 GIT binary patch literal 4564 zcmb_geNa?Y6n`4ThsY=*A|;|JDjDntyL_pcUxP@9q!f(F$FjiU!rJaa4nwGnD505( z2}1~KgpPs|5tcBHD2f&&`zUA8u9r7gwt5S{_6^L)0?+@tDoe}n(S zZ~%@wh*4`YWEwTvIK4rWppP>f;!GNChE{Nu@StSQ45v zM%_9yfPydr@w(Xke?*~7fBCD8u{!R0&FDQ5cKUqyMVY$ zKI2RUf2M@_O4=WEuw*kH)$?I43?x$GL`!-#=tRjzek#}*AZCJPgT0aXG%wm)q`B>& zcY~CGRDo23)PYcbixln%BWsmua;4EJM;aiU*NPIzv+f}@0 z*73>e1r@P`$MTLZndx$d!{0n%-v@X$SRQ-_V9XB#_1ioMKKX3NEjL&UzH{rsBP5=!Yx~)Ai=BD6I(i1aN3HX`@8{Qhje~a;YpOrz)P308 z-BroSf8|lpt}G5ewqdBeh2ZSG)IIp^kSD2odX4hkgT!wv)s^78!+O2$wh8Z4lYDI7 z9}li?W6vDMFnq-;6|MN*vd&Xzni7l8G{eCZV`R2^?{>0|joS8zQ-sIzdaAwLZxbGi zkI6Bm&L;IH2HAJx`;^sT@vUd=N&*Sa;y1a~R}T@qdVkxKI!=8dczItr;j#EhJ@W@w zl6B=*Z0p4LyLJ7LkhM2Y5*|>*{bwfajoZw@Z3<3ke&*mW4kZr!$;n?+njh^**3H(} zI=a&(p5*BrvD4`y;jwl6alJL$o0Ip_^jYU}Nj&3UKR@`9KPOMhWo20zhoARkMkK&b z^`$Gfx_%EQ&xR$<*?T#ByPLf$3OV@cF5@OW2S4OoIpr`1U+Ulg{TNQ&h})HQO`JZ& z6h+UPM)I)dYHrb_v0jAVplY+5O7fok*uj_aceM36vFmZPb0KwXz{Z$> z1D@6RUBLKR9r)J}K63fB($7>Bo6&!r=@foUl9Q;<|+Lm>k zb%z;NJ?bL+X89xfTNL;$Y+d)pn8=_gPM)6f_=1@nysEq5VF3qkecSMLC?|h=SbnW9 zk1zCHm``vp#l9^KaoBN;pXU_M=s8 z=ZVkiH|~1SgWt-mPj_deCOuE`vHBjlrb2fT&+s%|EvH9Iu`x_>#0a-UFl# z<4wNwdX16rOufsT^GJRC+i@~T2VgQ^nN0StqgIc!9Z-2bUjX+bcLLLnE1cQ3=64SFKO&dBBB z9_3lb}HU?xi~7sQ7MjU@va48ltQec5Ko9A2rDX;nE#(6c1EcT5bWVx L<8u@R|IhgghK;gX literal 0 HcmV?d00001 diff --git a/tests/classic.f2.translation b/tests/classic.f2.translation new file mode 100644 index 0000000000000000000000000000000000000000..f4600e73a646bbf806959b23bf5844553e869958 GIT binary patch literal 4563 zcmeHLe^69a6n+}S4}noaTqzMvLCs+O!Kz?p{u)F=B&A@?Wmz8V;<8Ko7IGLuWJEVK zQ!!x(L5(Nzz81SspobI0rzu84T%KXkr|YxDq^kGE`q)T<_KH`w#gT zi5qAX0JA8WGR<01Z7^vy2DQbcmb9W#6uj^`qb6MxNJqLTNt#qq5?r8gbcg~On_oY7s z3c?V;^8m+;u#gbm9;ibtCT*s$kZ9rf&#iKXlVqD%OquRT1AuA*Jc0v)Ba$2+?v(eD zo%fT~6KFjJqLSt+8W%x~q&e}9K{=`8pk56~LcEUVW{B$$PxR!-=Wtfwc2d3sVmZ=O zqWlobYap)&G$M}ppMtuba+e`?0DhwNFEsYiNc8L&1a2t&JV@;d(Ho$kHPeiTdJ^S= zX`Bf$jOI*-<9s+535cPZI2u<&Orkl_>mWA*EQrg7JP*~_m*ku1xvda)0!jc?02`nd zfc4F?nw&c?1JL7fZO2-pT7ubTis3FPocAj^I4h}+!(i0oBVR@)mvu7}l3 zr|t1vO73~a=f&si$bPe$coF=r&mR6Y;#t4p!?zwrqke0+?^W_MllP~n7E~l49rGPo zGRgZCN565@o)5^q!F(j!}yTzT@!0$7;IBeJ%GdF8eI&3gX$mH5G50G8fIYPA=9B zMLI|w>yF>&rrnNotpAf~KVDye_}Qxt`Yht~Ux;||VJG5Qe~w3|PYUW!&HFTp+-vgn zE4FW5cnI~gb!|O;X0aEKSH%U9_o&?G{g9CEYaHHQthIg4nR~yf!(Pepzw)4HM;1q) zP(N7SjCgjx)ZY8;fIpgha?Ol)_oKR@R9`~g9rE=moHg&*kRQA5kNelPvS*I;Fn+}= z6)ohwCHEf2dX&zFz&5mwJh3hM1ky2Ie^r3u7Sgf)_#8<$70nwx$F+mJ zPuU#S-*VceWH#bi{|4VW+aTg?ds`pXa^?$R%X`X^j`fe}n%}Ew*RA<9G}$7Gs?<1`us;hF+l%oU+lTIx?LQf^-G$v zcXRYEH@a68a`=;W^9BQlKj2k4?jVO>IEJIr|V_6gPPS@?p=_OGRTw z1R#BVXsgS3}-e`^!tX%9J${#bP=89O&)^bHf5V(<)#O`<&0+oNZLucCk!arZ)#h_Z z2dQJ76H`XD)N}ZT^CzZ~?RO^{u52)$DqT6nEEe;_ORe>7JcV9N*(ncNseH@`3*bnb&+pn zwoiA0bji;lKQ`YlS1MGXe#WQi8~QvD&wQhvb-#KN@k`R?2KJ#jOgHwz>(yqYle(9A l<)iuJpN?Yz?Z7F6l}hE4zn|>D|6~VT;l3u%Q7rs-&R;+yuebmJ literal 0 HcmV?d00001 diff --git a/tests/classic.f3.translation b/tests/classic.f3.translation new file mode 100644 index 0000000000000000000000000000000000000000..cfc134f3838207569d4d93da0db7652cc2b09cd7 GIT binary patch literal 4563 zcmcgwZBSHY6uuh9hrlSIu9S$TsAO>W6A&x&YZM8Ql!7r~Sr&J3VQqIIhap5pl+;Yc zlraP~LPt@F2umDC6h(|Ftu!)JXi`eeaflR0&Ca=dUp=$F%=D`}oO{lB-se2$+;{I@ zF2uhXKTVJiH}KEOHU#|Kr4DnZIoFsr-=@#9Tl5aIHA|)n!ZQ#p40)jQj%}X%82k@` zCvX&CHly8|Z8I2?EmnixlI*Z1+YQDnqu@)|vhK+YPMmC(IEpK0N5QibJk*~pxt0I zFLeMY2>rlb1e1D93Jc@yL9$J4vZo5ukPAnjTQvX{ahsS=S4&|KK#gFJ-~cCijOpPe z1$=81n?k7lNe{+$6^~@XH8}d^`#{STSImWV{r7 zIpI{2crS@-Ag%{HLNL@n4*6Lby8yl&>{mJeUH09wM?O1x0qYN+2j(8&{lFA*&N!nX zA1`B}ve$s0B*%28)w939?@ZK2?s9Z-O`r%t5eRhzm$gbunHgudM^W39J;X z3alEe7L4+nTyk7H7n5RLW<$^7PJRfW&*m^L0+ysG@LJU6wj{D&O&%1ZPvqw=` z?X6jOJuGKD!wsL=c+WGuAhFPd`^|FHLi@{{JLp@2vwF)X?>>wr^~F&`FX3nATA!|) zT9HI}Om|4>c)#Nu{>ow7KgN55>EI&(YkuyoTN^;|ktfbx8w$fPUW&12_zsd|4O-qG znQI?_XFP^i?f81l_Z++=I$l{r`Y`^+VKeUh$iYJo)pX*0?W(`E?8}^s1ZVr!xOIKV zWYV{I!d6p%!h=wnJ8`F{VFTf@`p=cWT$xJnhy{E6r*rDh&3gG^2f+W7O6kjMe>Gi=2CoixX!B>pnt!b=&|emtY=vZ z`_5qv!{@zT(TvY6SDiKXQAzlnW;ldWjX1y(+)CysFt)}XB|N4Zs0&hDCp=c4m}fUl zB>jd*dbH#7l=Wft%_rPTBM8pwR}8JI?j?Bjj+RHYoc_Y3xi`uQkJXRpoYFI&%vDse z_B=k{UHeBxExCG_@PHy+e|FlI7NB7*=2`BSOJ>y?F)$^%_qqF#ex~z=DFMKpE4&bNur7gd@ zZZk(``OL=LEgZi4)vkGKIQX$P+X@Q@-|bsDY7YmWt-1BnAWq-d>y@=fIQx)Tk}zQm z(P7`KS4u_<4kG+|ZHxP8qMI2oBzzmm+5VLe?s*M=N4wr9?wwxlex#2Z#8?x)Gq4)p z3m8A=xn5uVeaUj4{lPc$NIqx4I~7$VXMGa~?#_te;JY@rC1h~$uEJN}xJmi~MVcq3 z@wf-R8?pW^MZ?=Baq5dNCmp#>u7}m%x)E^RpVX&o{d;F}>Kh`J`|(|f^pgHW1tZ2GX~dJf)j=IBIxPhuL3f3U{7PsPD!92}>8m4jbPUDC9aGk3Ig z!Gkt(-Aq6BR+9?fgfce{j^1oLx_e;_mWQoP9~zwtbTuNB3~d-6J}p)4H#!7;ogc zxAxlz&)zl1w~+M5KOIMcodrw`6-AMIR)wnp*Xne*s!~1XC?hb|X(U96XHB>g&MH+T z;t^Uni|PnCE2UMXRIAiE5#%@#l^XSxI;`z$22qKt%1DW$mL}1JKjBLXq7FOCI%;HU z)i{+(D={_L#Z_M^BasovQ7fgHl{lLi?nI=R?2I;C;>d_|l}tjID(4P}l+WK`=PrpV z>AE6`nsXkaDQcg-3MV3Uk#<{rx{50F8RO?7iqcstsX2RTrO(&7+uA~aJQjHP;L&>za~MKoLg_(p4$A50s0JuoDiTNZg4Fdpb1bYMrIO<7^4|fIk zcDnB8l#f;NN#I2#)+>G%_y{E?+6z!j@)*dMfF&S2MTu?TS0bG7$&tsw3IN-z;HBUz z5N9`v_o283;ySPfgc1GYkhdw=dGH-zKPmYyitkZ8;j^O;u>SD#Ah{cOFEC#vXPhyR zPf)NR#cRQbDly|>KOL?`fGtosF^XRTK0%2IKLz4+FbBf2AkIZO)+O;;<=O`Do54!K zD#5D2YQZqS$tfq-&NyLhke>(Z1iK1$3+xV<&>tRau)$zV(+gr>Fn@%NRpLqDMJ3jQ zpQ^+&6d$hmDDZD6G0|O$Vv;99p6-OLggggq4OkHvdEEqnl|l^v1TyY>2L|4~1D?H# z%4=_ill8Ei@l4k}=8}7!;kmJSDP+G{PPB;KHfIg_3gN8Y^5I(#qfmW8n9oJ>Gjpy_ z($Cl)hj>hPSm^|>;~f5);oCkS_Xg7;uK-f>L(if0eh43RqV1{=48wTKq}~xbP)=%y zW&fJC{sDN#V|e9`FABfm;KdQqsv6XX@iz^hedjw49(1^-i`>`F`X%L`t+;@2wr`Ck zMU$qYz6BFYQu-qvgmmuModZo95s%e>qWbaj41|X)-s?S!Q-3!6#fO~;XZ6{GJH3-o zeRA%nk>p-;p5J%lx|#b>J)3L8iIcNEdAL3%ki18ob>5#crTY>GZ!a-bea`87zp%;1sPq>zbAe_~&_BmA5hw!Q$EsttB{e{r^*DDZ@)sO6&-n$6R zmA`%cIr4sY?jIJm{K^r;0}5S#X5!ZPH5}Zf;IQdu4*o)4LeHNZ{pzy(7)7@|5;4_HF=J@?`bJlo{?%8n@Pv)R{#=m^3_aiMwC;7alyqv?&dla|;;K%l* zJ*Vo>7LLxUIgMFcIegbE-3tpj__21|Y6}P7Rvgi|ZJqo8~txxD4fN|0;&|zD#~cJKra+UGA=4sE-T8q$YT$ ze--&IVEh%&^m&rsmn`?F9)BYnlZ( z=sb~)$KA-c5$oTQKcYR9Q(tf?uHhD1539d<-S3dUA)Rwv((vXw4qkue=w$Mp#55THV2yRZnuE_i7^s`Z!LKGPZ_41z z9bsMkpdGE7=||mcQj>3C=f0go78s&AI$agZ3MO#y%8t7G1suHjZR^+J9R1da{F)#h zU$}mHI>I5O`!+XhV9^1jbMe}@jzcJC>nZlVyJ{_GUzU|^+w8*8Jra4hL63A=_gA)@ zLOJVSzv*5V`BrB8bSp3=@j0Z&`upYB3w=>N!&A-mJ%bU>bR(a2zjzGcb5f^{??HVS zZ`9e>t8Iv9@1EzGhx(I09Y=w+0VW2CA$oEaMd!0tMhpno(O5n|#(!Kv3_-O|!vB9c z!5X!o`qxTTYPuE`-2uIpOdCuQ4UO@NWJF7^sx^eErBzxvmaFJluF}!9gisxsqX{Ne z8oHl4xmJ!TQ%7SpjrBCvtAVc)Dbql8bVOf9RBFOuSLr?*=vB3f;3|TsG$a-cGLxR= z$z?=M=P}4ksvxhOUKOc=s3tRr@~Y(((WyjvLU~X0q>Eal`(U6QWv09$`7Y9;{gl_P urX6Jk^*^fk&#k3CBm|>s|#zpi#d#$F+NDk zR4f@&d}P=ZCXr!<(}-e(F{PD8=8GOuT8=}cG+B1e+50zVw!fL~aPB$h`@i$}&wX$q z{gL!Zigk1aeS;-^K|eG<>?`mUdva$4vkOE1?65CTXi*jAdaxR*zD^tUU9$NP_&<#9 zz)1uNdP0Gspxcw>54f}aS>Zrd$n7cgC~I|zCq!;z0ii3BSJY@LOd zgRWql9n5}%+0|gzg6v}$=05=b5eqvG`XtD=mj9!r+bxZJadZOK1+EABv7qBY5-neF zZU=w3g^jkf0eY-u3m(@KU@Zk?y2Z(`^y8p&EF1Y=unR%L3@ZkE3G;bgw3l0J&x2kE zQVvoHQUy{2!ubtRKCT^(!j6D{9ONv>Igm>rmqC;+@K}TN1Q9vo!A=B8X4qiM9tm2t zY!mc&%bsZIsg_Oy{g`EA-r3AXKNtMMC~P74i$RuxtOmi?%^;9+u;E9+c3*g_`<2U} z#j9vj&Bdv>AK?q0`$Dg2c+U%bNoI)`=Pi89h4QPfxc8?F7xDgAp8PY7#g~rjcM7jr zbbOvUamy^m6M6fV505_};V_zvV9eL;dsZbeeBi+&=lVf2f;Y$0F<>k6 zF$QJPPX(*4f)+f1S8jcO<>wN-EG1p5W_1LAZU4!azm(vk_g1&!eI1>D!=`r^oM5<^ zTm6RBBgeD4r6V?YyD%P@)OY5#?(Q{=C*t4MzBx0I;m(<_C)_WIKRWfUKhH8;#4qZ3 zHX)D2=P!9D74Nm^{u9@%nDhpV7kxc{@X+Kq8E$3_!}n-(o)^cAX*(^!TQ<0>-jme* zqyA*e4oUtKSIgEeknm^Kc2+bnT-+};zyGo`nbqAt+xFac=GSfXmE*f3y5GcZ*-uxo zd}80Pbu4TW&m6`G{NekyG~#$ao@evN}H*Ve!A21$JX#YjIFJ~>4;9X1iy1$p;cXsBq|0T)4YvZzv z9;|QCUt_Oh@pD+7w(HjPJj{5akKfKT77vx=JvwB>p~Wm-@XvhI@v0%olYiW{X_JIs za&6djfd4g@mc>^_J94 zJHMl5pJWc1Wf>y|vpnLty1VSwK7$y)*4`9zJIh;;)Yq|*`C@(*eLC*N-_gUb}|=yomV^bbDe;CG$ny%o}&kO_ku=*SBQM zmEdh9_dNJBs|ytBC$;`SEPfk_`c2CQw2YO+m!6)r?-JXOh`)Ft=~x1b&$B0VPLagd zxwKvQEhOrQ_=4v2fWS}(mw&S2W5xrM`W%wizp++=*B$D@UtN1ohKszZ zH}^QTpW##Hjvw02>ImMzqmS+iGG3_dfw&S@AOCb52yz54b+l@?<5^Xs&ZYx#&7t90 zb-`KJooL&TshMc24ze{|)$BGzw8)tdi=)%3fvc)XXI=~WnnpdC6lFt>U85)is~DQ9 zXjX@sMs*|IQgzj!4z)<1)Uyp^?JC)J%w~f;kqjb_wO<37maS7)v^zcxo0Gbt{Dz&X zQ%)_?Aw_8h?aoEJpx!i>12XFl#5EV~kzzF+Ifja>nohHFVor^A9odVnQIrGgnhs(* zX?J$)&_=Z)XPxF5nY?CVlwm`@sUzQ@TDk+P=(JNC^<#J8s?C9W*C|SO(RGYmS(>>T z={B+#oqDiSS2oHG1EIzX3B_v~vIe literal 0 HcmV?d00001 diff --git a/tests/classic.f6.translation b/tests/classic.f6.translation new file mode 100644 index 0000000000000000000000000000000000000000..7c1232579f5639fe066cb80d3b178dc9d03ec1b2 GIT binary patch literal 4563 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 literal 0 HcmV?d00001 diff --git a/tests/classic.f8.translation b/tests/classic.f8.translation new file mode 100644 index 0000000000000000000000000000000000000000..291a30411700854b98ca8f04b22164d693cb199c GIT binary patch literal 4563 zcmd5=eNa?Y6n`29Dlkf@NQr2QADQeI%a@t?HHd^rO5vEWEDO81?Aq=^4nvBJD505( z2}6n>5jqM=WLV-jq9|faVI`5FK$B8pjzgq4YIe@!T|7N+js4df&O7J)-tYX*z4zVs zco6+s^ejO-oWMUV*)Z@6Rya(lrVK;kBAd=)H|rcGt3{#;!c!0hw4Q8ox_->74}5}P zAaJn2X0Th+Y;~dsFyWU_i2=4TnMVD$2up-r9x9gG(cEK4EvBDq>hj4{C z%?8!BG_%1TXH7TQY^FqmFc_{Fb#`N%LziGS2yT!jr0JI%91`FHfZbs;S(1AN?RuMO zg#$oA=m+*ZnAju4-=DVzamhwYxEK4=^t&XPmK+ zPn58!lGlI_kz&T9eg<3%2aA$8F_K>jK0%6+Z-m$a<{(%G#91V#x)`sMu5ARr6|4}f z6s!!a5{&X|WjS6uFT)xkZvtxry9Ra(>^7LtA0BHkS1_jO0kIdD55dMs@nrA{Db|9Y zCdD%)A13)o@NY;l>MkQO=82G7WY|i`SAnes+XRNM8(*+Oh~Y=T;l6ih;GNsx*{f(r z<;^gh56c-(-|03F_dLV1VzZ67-YiEgwBJn`L%t$7t2cl6)`Lh=pBp;-GTt+JeUf(O zt|f%WbcYpA^f<-guN|@T1Kb--2VVhL^F!B>4c-JFeY)}5a2O2Z#T&Xu?j||bpk@A= zy5T-}#$$Nt?l1Db;o$k<(aH+ahw-=cbtb`s7Vr0*&8fc-_Tqy!g0uQe*EY{2QlFgl zX$0;y`S`syub*{*)U$DIJbh-4I}g{!Ou+Z3T<3j%|BfphytzPM_Bp5Ty_%Nh5{~|* z`}teaIs7G6J;k*IXZxk{?r-~iNZ*so)bH*kd3BMg5Z@j0@p=u=y;DZ?*t|dPURlqc zIjmv$!dG_H;d@K2lV=~Z1fOY!LnziL2AKUC$T+eL4Us1ZkLmhoeZ8&|9;=Vdv>T_8 zej|fjTJU|!`mp-C)6RuK1ZVYYh94>GA$ZyD`iGUA{zAxt&SJu2^`qKnbT1;~%GtHy zBEH|{{X;{SUp+>6KoRGkmbg7`EeChXJ*xkigTK&|(Df%rzq}|XW)K-S8(*Ev_UskykCGie;r zVb9e|`J;yV5`I-cz4KV2o9aC*u!!Vr{fdWnzl^`5<@?0BeUP&U>Ei@3)&%bHDZ}pq z#!r8y#~puPvfQoQ??xuc=MQ*uS1HL^-`K(XQX)9`-fhh>DIB~bd-|(4NME3cl(sNiUhPJ3~D?nDk=+ER5dmxI^6ZT&ioqu&soQ!$mt7dp?) zAUK5Ly3Gq6xaknlxqSUw#}SgV`Q&@uS-p<4F7ZV>w>oijk44-$t|dAR2TSYElAQIg z-g37czm?fK-I`!be2(a`{@$zXd0wQR;VGu-E?0sx-H2xgT|P$WdyM z&*7-VT2(M!RUt>I74Jo`oUhU#u2SMGRH{e!>v7HhfQa{0rIp|7#}(9pI8K#Hjpsmd n?#h3wQmMt&7I&9YoY&tppP=L4_+-b*aTnOv_#8#UzjOWqRh6;z literal 0 HcmV?d00001 diff --git a/tests/classic.f9.translation b/tests/classic.f9.translation new file mode 100644 index 0000000000000000000000000000000000000000..94cc3f652c9278d0763ba78c74d0834c6681cd8e GIT binary patch literal 4563 zcmd5=dr(wm6kiPj6d5Jdl@if>XS(kPn3=B-36Ye7F>zTIcX459cOi!{L`Ia*NX3L9 z#YcpWq7o67IF9&2j47=&GE`_%N{n%c6i3a@x!w=YT)!r#zq-S@=bYdDo!>d%w|6fW zqF;}mE)x$A@K1|25d7RUw=Kn%X-S;#G^M)iCb!LzDpF;#ryxpxwLl)bwZYK?K0)9E z966ZN;&P-r&6aq(!)&t0yB+Z^vnACc^P|^NO(_-`R-{;5F4Gc=OXdZMP+^e`f-udV z?u2S*y4~W6cVt+cPFtcy))%f=O)hJ^+mv9p$ofH=kZxXTaf^UA04}%Fmb&Djpv&yE zrMUr=$$Ei34<_^onKX&F2k{1*Q>~FrM=l)yxK*BT5x0r?B%=@p15^k001j}1$Cw^{ zL_9!pJy4R56!Y=m6=JLt{S5HoVvO2RB*r`j@`Ydt1hp1Hl>Y`o_go*kQG#r7;mwqYshwzV-4E! z-%{4z1J8I2FW>%U{wFg#jWN%}DUhQTv$eb2!s9;|G|`&z1BwB_@Riv(x;R##Lo zelqEsH?GLqoA4kM=8oOrV_r{qto~EwPgkZ9+^}GGzzk0Pxv&@Sw-B7wFZXQ;NFw!1 zvOkN!drdmOeEpi~dq_Q-Yu)jaGyQnDE@liqN2NL+Oq$eonS(bKnJd2F^u1fx+*HQV zzj&{3Lk5Q*SJPd3g5d0ask-y~t{~F)=pyxdJ4s$!Vk^dHhjd=Kr|I1aqQ}<#N!PLl z_MO8ThR=ItTRlFvq&oSo;c@t#W;ldGjl$DDx{=J0ZE1`=LU>F!NEa->PI#<7cDc(s zf%F?<^lrxIDeJ@P>yLXC8wk$oR}QMK=q7l@_J#*loc^+qx$UKd$Lfc+PVJgc=E~i+ z_B=k{rTs%gmtH+Yct8=>pPslmeiaAz$UA8Mg@eD)ozVFgM}J>QZcHCCH=D1%-+BMV zM5nFSdfzjI$L9F+N`2;Nj_$cp<4$Igdd9zUs_SD7M`y_e^_DFhe$In2Q2;--FHKn$ z)tfjvD`wSYZszd4uC~p~=io=1oGa}de3xI@@ZB7Iwx;8U{+zy%*UPF7bM_&&FlO9H zqQkydFBJ|Q5KQ;mHrrQsHU$VU4zR@?9lYEZnTieP>&icmo-IW}{!FO(Iib>|+Z8=k3yFvN_MVKd| z?wB{e8?pWkxkH*lIQ4m#;||{>>tXdB?Sbb5NPUtvpnDdlzSgMRhwnnH535gUjCL># zy>scm4t_0R>4`MX+~JM| z_nOGMnSNx)2^GEzOZ&F;k1|GcbXrRn=Z)py<;^vB^Ei0@JC1L{IQos@xs?-nd|CVH zsRV~m*tglCJ_Y-U&ZX<$xvNRe)>A0Iy<#<}calDgH|*RS z`<#U5YMbMiL;B;Nj>Evt0;ZU#P$+uNMwK37qfyy|X!VHbwU0Ot`39r9hhtFcdSa^f ze~XnmoLR5c!r7p~73uYlR`KN1>V-Wq=ry3AQyK7VP~lnFC4<5U@#AVLCGMn3iG9_o zM>|ZJDh+ZJTH&n0+0<%ORtox*sWBq15p*BqIl`8&@J>K`<5pTG!@p}{v|IYavWTdeM literal 0 HcmV?d00001 diff --git a/tests/classic.flatness.translation b/tests/classic.flatness.translation new file mode 100644 index 0000000000000000000000000000000000000000..f9d11a3deb99f7d6308960284eec7f20a9156836 GIT binary patch literal 4929 zcma)A3viUx6<(+@;gxC(5U{+IcPqK~f878739VGbfrt^(8XL5RWV4WkB#XNVr6~oZ zASoaMsghDmKq)vSlt?3vhB^k&G|G%HEi|?u#2HCTTFPK5VT7UQzL+!V?M(mS%sJ<~ z-#xE;|J@C_-^-m5QqLWr?^H4v^y5n_qGi#lNb&dMh2@FT!is3DTv0=zuYvXAQ@eIw zX*xLZHu!%S{eY7J5|1QemGN+-pfnaPEG?*r6(quu@<=EZuay^;MM8W>StOAtTog%! zlED!>BB3E*E-kH$!|r%xX(Uk)TNa7Oqs5WX09Yw0Oq3K<6c&|6LW969sthlQR45p}CEp{t8d;wLZL;KUVpZK@(*&r5^^Jt!y59F0#3w2maF_MF=lZ zb{zC_gmXTB))=sAz_uy87IYor>_PT#klhIOVUQyTk`ogJjKLvCeNQUw?=RWW!Dr}0<4(O@M);z4I!&)}TT*b*#`f1Qb%I5qMu**Rz z5LN~DYUJa%+G;W z6R)T9``Wv|Q?nkpdD4)7#lQ>czeM{Nt^VDdmko2v*s^}cDzsnEVbihqXTD^}w~6IV zco4)H(lfPu+MF2Pk6Bhpzu~ z-vg+g_nxtT{sr=zcSLJ*4S6z>3V+%c#nXNKx_f!sX+!>b->q+*Vu-ULF=qY?hz}G| z7fC7|Z=rdtj-1FDVaPXq#qE72U+)o(oAgYtkW`pn8&^7&8$URnHd!3Su+=HF5M zR+xW3^u7<@>?yi>6V;*l2X?H>`?_Jit%FXdZ9(xn`)nDQY3T3Y=Uc1ZHsm`sZqoa| zNBecY^B;7-mV@$Xe9;+u=OqJw&8-RiC&PdB)4sBy=~F|TRgbh(br|@`pLfpt*nq#+ z9)Ipt1HLbH&zKtqe71A>&l!fiIhXbv+F_V)eofva{#!_&2W%DR`t6z#cQ>NB9d_H2 zZ4|d`_+YOS`Fc)ucXvO?zteO)jVE{XPreuBfuj<6yxk)kzJd75?&(Qgi{cJCF#aF! zApg;%AJ$(-zK)+iVBg}n0e|%u?RoVEymQTW9{UXC1yj^Br{!o0|E;0xZ(BF4{Yk_A z>QCn%;lF1zPw&6nHT-lP!WX*fJyFB{=71g;XUJc6A~&XEavgvEqxB7lr~4hZaA@mR z1K#}MyWe`sfFEp(?f(eXrQ^&zIKe$`_!sV) z8~nr&r=xB`^)v&%_w3=XP8jgkAH_Z{HN-!Wy{>Vli683v!vciENW}Th&g!>03Dtk@ z(jO~Qk+18n$+)&^wqcG7cD%CfPD9*x=3F~657l>K|K7GqD6Y=my!Cp=zYu<9LP_yt z6i??LzA~|4EQ+V`#nI-gX$aSG=iJ->+-MZ{k;T)-ccJ<v52hMAr29_9O}BFQ=0|88Vj{VQpXPDDKnxD#UY+8$(}Cj37CQ9`J>WYBOvt5DslrkBa1wmSORr3T`O?Jz~OY5tk{{TyS1T6pn literal 0 HcmV?d00001 diff --git a/tests/classic.fourfloor.translation b/tests/classic.fourfloor.translation new file mode 100644 index 0000000000000000000000000000000000000000..aff9492b374634c6538f886df8d5ad7bb4dc402f GIT binary patch literal 4570 zcmb_g3s6*L6uue;C@@N>NU3NFY9@P^-Q}T``5Ht*C8cmoT$Y7hTv*#(%wfz2H2?fr(YN!9v;pSjp&&9vs2Q|CC0Sx%eLWwmFiR7rXQqQlMJ^&9r)4Ez)P z7lAi$0>K<+r#;(YGAG;YCZjFcWlwgR%vom1kFI4IGtClKWSX5$W4hTXc|yV}%+de| z7u&KOQ0>UJnVre@C1!`inrfE%z>3A_v?RNXDK@j@3u#KWX_48b0$u<(T@Gtjx+3T_ zIjoCa07_C1uxG(okLa*4(F~G}S(zHUG#R;Y{Nt#4!6J?ceQ&TdxZpIK-R@vWFd%hc zkKq8vJjV3ED$E1i)`Q&g5o$gLyhe=;s-FTrR*g|>7Kt%WgnT|&3c)RE>;S)%;K;`# zSAgXKwnfE@z?TxvZW8Y!aV5kxV8;lC`t^`EtJp>GtzbW>`A@3vR6X+f(G6Hn_*gLa z0`CtNsOFqA9P&{rHcs_A@X>0_dDKsYwOFuODko9(^TDU6G4d@CXMwp0mILuhl2cub z*Q#q9z;6L70xJir0ILF{{8Mf@uAOtknjyakb`9(X*d4IDU{X)`c7yqVaZP`S1Hpz6 zY=jz*0k2VG1NaGQJW2I2s*eZ%x*DVI0up1M3VD_rwiNQ^V5`A4g5gsq7_10l_>pkC z?;iBNcNaW=B9&C#j=}5UIp>)=e5d0*&+(N>xfYx^&ru8QS8Gn+F9^=-Z6Cb(D4x{k zjUR9sKQs6GG{dB_d4$Jx`xlM!uNUxF58VDf-Wyy8p9EO*U1#}(Uy2<-UJ>S=clc%TpiEu+=C_YEsb>0gLYri7ETMA7T zp9=ausB3N6EzrO8uwe5N0e@aicj+mD^ZTXh{x5rmkiI7tgukDfQ z@$Cwt$FKXNuBDCqJBKwKpZ#)K13tIhb@H9V=HYjm;}EhMO)pzW6WPZ~b5s0r!sEI_ z48egn36Iw&EpuANl754tyjt;j%KPy8hLfH}kp$=Us|Hk8bQ8Q{N8{rvL4PTFW=ARE z@%q7S6T9Y+eXS{5e*vHG?)}G)Uv&K_;Q@tRe|GA&L03@<4W z@N*xB&I0&vb7@&#QN2~5vtn9Z&Nczx^LqR2d;xx<#j(mJ!1ws=9=2D2PuJc4wy&UX z{LS4}#{_doDo7kXg6Qz?)e8lK`vntzjlR)yIMK}v>K{=|az4M(eqAr&?`Ze?#Ivop zr$6cA0WsD@>>N^o?**K{xi_3F>R3 z((mQxApe zUliasQWl+BEZBFfeeS~+a@|}%{`M&?z6-nez1DYDRDwXKt#o1DC;?vHTJs=JfH%Bl z|1w6P-xRy1a-4`Sb)20@a0uDlrjPgDc#!B^zWKGQn&kX?3Igw~SSy&z!s6{)JOsK& zMXt^^#kkoTL!&=+vLvXGe_jK>e zCkQ?*V?szL>BD(L&%buSL3qyg8GgB>KmG+d6s#FA%{Yxl^FN;DC{)vG!|@!>VmXo_ zT82d6S!ZBz)L)3q@NmY_=@~9FrVh_~C1yI|tV+l52nA6n#7sx4RjL%6byVlZcBsT!c6G8cRmNxg)N0urbjqBWf{s-we62EJ1y`6vQ<w22 literal 0 HcmV?d00001 diff --git a/tests/classic.highRatio.translation b/tests/classic.highRatio.translation new file mode 100644 index 0000000000000000000000000000000000000000..d521d4da095ec77ee9da2c917a8371b1945a01f0 GIT binary patch literal 4930 zcma)A3viXi6~0ho!YjoXAjI;jJcL%VyZ@WeN<|!q7$L2(q1KSxTyihuf%hhqNhz;_ zq<{!SC8e17px~6GMv6EZ>c~UWXl8_Ip|J%a&PZC)QU+5ABMd!f|9?AY(sic)aORxz z?ROq~cK>^C$oqcY>`?IB2Kx3uMu2`~c~z`DRud`tLAp9q0raBx;Xrq z=CPUUhW;1)Ka4@Z$pDE*5|!2QaHO!TGF((vSXEh=2uCU+p;Wq7QB)oYVMKW(ktiyS zBtpsH$cRX2B$&&~s^btHuP%!u3M*Gc;_+BXBs2t8qD6^lVO3FaStK+J+~Vr+vPe|` zqyUhpipMHS{e+2dJhr?Fz))xa$lV~a#*C~i-3$s#gq5|8bCF zf=2^84tgcQk&n-M4OR=-&H%3m-9R{diTxX5w}5>Z*TS4yxsR!8y(gbo4gz``H^KtEie%MLy&wyM2xd?Iv>>flVITMkFw|B<+&fjqVg3l+%s(6+<=2?YYWy#XAvIe zLis#aGyDyLtN5~CJ$bX5#MfqzJm(OeieF;i-?)kJ6h5Ne ze0=rLmi=I;eT+MP^5O(oRQ}>f@8~PUS9MnXy?hJaCB;+tz8BxxoUOs@a`JdBsjv7u zM$P%+9SuJH&6chK8hqEDH&(O}989^7qr0|ETSVqjJ9Ss|=bAnWUK$kcBs>-WI{)kW zFu~nNUropR+JAqi=H7erq^AC=p%>DBN#aY_{%-#Bnz?0c-!yv-iC1&jdi=dP&uQvy zwezRkNAfEEGg(>P4{P|HyTVQB@YUJB?=O#@?OdU$`!IFy;GB> zzV~|)uj-wDzxS0~QcvNfXN*0UH2n3qrr=M8|JhIH>ZU`VX!5Li@Muk!hM)Xd_ri}f z_`99)buVl1{i%B=+|c0j%*%hy(A3SnwD;g{&3p^$@~7f&A$1-QD$n&hbz|;mA#*!y zwI>@SZ+Yejr74r`wL zkGF~cP|}YZuM=P8FBr0aX%k7T3>Dl}dcocU{J{HS;ucT)g{*owsZ9zCHiik%gqcjsyGJr;@y?e(R3wUH>BZl_}AZ zX(XSjpSe1*c_PWD@TIZVt7!yRdFS6X_}qAs_rawzC-;#46>r?B$C?k2_(bw*?xUab}|7SeD7r5U_$|4r~KC z%ymuXAi^zSO0r>i!onrX5su{8%;s{*6t<8>UC&`Mk73#-7G;(pOw7YfVcOEL81rPS z7WZTn=Y}cdE?mdqXmDX#7KR%Jw;b7q!G%PGW0@Yd0S&vhY@VC8EyE4h^)o~Bjzk>c z3V+L-F*yVrnO{N}9)=sju{~^_87#fU!E;H&Te$vtIb62Ex$8#>$Ako!2M*ppFV8jP=wRTU6--RHvO^oj zBFQEU0hdf6{2_4DvrV}KvomFN!!zY^!%T%MhiMy@DSL)%<8Rr7ONyBV3{%L-d)(xB zxDevVGlgBi6tF|r02(e?mM5^5;lNFj;gDAz0r#K}i7=p`0oT~^FSY@hF&u{C1m|x0 z2M0&%3R%K1A)}0fOXe44hCgr<()b&MXxzKu!fnHZCQbv%&=>P?&d@p>4;b*4Ir7zm z&S4w4#5_Zum*v8{C%0_5mMgEH=lC58&lB>_!zdj2f><2i5G=ukXJApdjm(l~$~-Pl xhgmL@Q4C%vw@KbQ2X26T8Et^%5pWw)VjjnFOe2&6pC9;nl?VTO_8+>W11SIi literal 0 HcmV?d00001 diff --git a/tests/classic.label.translation b/tests/classic.label.translation new file mode 100644 index 0000000000000000000000000000000000000000..6b75b1d23f6abad6704ef49542fd99b96e2cf604 GIT binary patch literal 4614 zcmcgw4Nz276n_2?Ai^Mmu9%AXgOZ6Ppa}jX=?EesDT%4DEDv^J*`?hDjUhx7Mf^#i zf*}McMJFMM2*)5tL_?GrwSveX#Ywls7$Z^`|2lWON3YMTIpd6PIGpo+_nhyXdw1X4 zh2Xb>eFb_A1pg8>2k=Yd4XQX*k{G#MC)eoJa)U~%p{ar}0HO^}KhB<#=sxuU`3!+2 z49w!Q4P>X^!z=#AztZ1Nw1rU0JPNj+dPf)MWsp1Vl z3PL}yabTt%vs_(yXAtHd6Q%PId`T``Pdq9!SR}_pJULgjJVI2PkQ1Ofu={XE8O-XEcne+I0X`cn z53B^N6s!`A%|9W*WbL$sI|sN0>=M{jup3}E!G!+s4g?zvhMIN|%fLo6+;|$hfS*QV zPw+l8o=^QE>I1>Aq%qN5%ftjn0@g^l^?*~rHiPW~BX@=qSRTaiBam@-eqniQCfa=)a8rYWnT4l&Up_O~j@mh7M0iNvs8{mHv`!vSM{ zhWD`ca!!4e=lmk_=)*kJb;z4!N6r`LLVok`Js;&TI^-!p)_(4;+CG=z$JC#@>IcK1 zZn)Sp;uM2XFZqwS?IQt5`;_cGl6f6;rF@Qmu$vL`alfdOHGIKME9M-KpL)2WBOL(F zfqZVk*NL`FK7^)y)aCASSqw4eXH3pjj^osa7F#OFJ&$u>{g-aPTnuLFXRbJCAJ3^j zzv#8Q4p4;q!}{dGm+X_7`smcJ0Q63k2J_int!{lt@Q#V;oO*i;Z9CgF=x(I)xCw?j1InED*OICFo~Jx z*xKpajxcl7N0J?Y%SRb0KS1xDzjqtK)BhNtTJ{s!H^T;z6d92?!tg6%% z0KTrJdmHb!bNUOjmUcEnJ?3HksE&C((agD~7j17&VfsL5+NZa7?3M2!#`%#?i2OKg zFYu^~{J@OEihCUX)!vA1cV=G9FUwC4nZxinUxRhCT>|LfzK#8M5AK6S#905&#fGFM z0Hpl+36oEf&td7@7r*QIEQaZaI?*lD3#vGCr`>lZUl|_LX-z4us^#cxSXh@-&e1Wy zVqCVL!yjwaZQKOBbp8W2`^FySL zH9Ke2kcG^-ReLm=uK-;$^G~n`bihQ6Bca?{VsDyxhu)nLMnIYYNt) zCh@v0XSUvB`ao!!b3)YchU);N`>i>BbjleHUtXa-^bYXS*K0w!vxkbqUyX=8QNWqo zU%TQ?56mF#8`yQ?^(^3}`j>2jyf$%kIts%x)&P%tg%M2qDru{}UCGIBSf@Q3%F%D~ zPp=Sp`9kL@1H(gT()aVW+*J=T_HDoRgW(KEH%E4B!?&Ds3D4h??ZwgkCg4^r`C9__ z-*l*?@iJgMC+uI7)z`6((Y@iUj0|G*@Ejad^qEdjk8>g)qpIn)Wq8yL7&)l@0>dwi z@tH`zqe}aaIsbN9CgkCqdgEf7GA57kW5CFtWeJ*Cjdq>pfBnnbN;a*$C%iC+bLq5- zSmEivFqO`R5dFjA#~ITa(oga)Y|qcx=;1~m*_MQUWDU10$w3;uWLW~Ed}@3iyfdCf ZUQ+)Ike&=L^EnTV+`I-gE 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 Fe*xPBwu=A& literal 0 HcmV?d00001 diff --git a/tests/hiphop.bpm.translation b/tests/hiphop.bpm.translation new file mode 100644 index 0000000000000000000000000000000000000000..8e0300a21bfed924ca8ae1ffd5a3783efe78c625 GIT binary patch literal 4680 zcmds5dvHu=6u&~SNG3wPD)E+RxbEG(ySa;cMU2KH#G^*l+H9_5CD~oO8$vT)^{9GO zg%I_Kw-SPh#0d4)dX0BVrIIP*Il@$mp!9rq?`Mw8*J=N4@65^XoZtDK$9{Y7O^6#B z7sY8;4Zxb3eE=Bi^4e4FQLMF-TNwRpY@hJ)y0AYNZEm`quL~S5EUbo$m=xgY)x$Q15kQ`SH ztPPktqf6(`tTV8<1cNt{iy~UM{`RQ+AxVyjAUWH3SE}l_1pf%wTetw!GYRx|t~c3i-6>BE&5PekI^szaJ=RdtxNMKYB(Km4$2b^xfTGI#o$RU2l1Q1&(-4nfQM1; zH1aQiUkp})IMRz;zg6MxRf&D7_kWganhL;|NMFN`;{w5&fRT#U8sh43;CL_ztUFjA zFp`e}9IW|NKLX;>VDX4g0^b3a4mK6>q-GYxUn6cY_~d=l5-baRSXH%4Z^lk;0S^v& z)`>w%iBf=vDzJ&rEH=*k{oEMNxAZ zeSQ#cl#<^GRrfqUu5#Ww#;E;`Q9p3i&%0aMc>E61(fWeMt4@=5 z2c17SXY9P$D5knS*^45gQ2nnn3N1RuoM(H>V`NkhN2<<0<5#{T6ny%5iY9DdHyPEt z*B@L}2c19NdyjeT(cMT#`QaI!q|X`rn#%a6!_a)X|KVe`RwN^RSz!K_fk;RDUacGP zMr81>TY7I!LOkuO?9#mmMSZ*FIk%DDY4kj)&YO^B$wuclbH%Bb?HQl9vh>F(BTzlv zE9B&htz8-V*IiH5CGU7TkLs^HDyaDf;^`hU9EQvTXpf9ey4j~uOzTeuTn$cT@R!?l zII#rrwC}99VS|Bw_x+9>e|Ct3_N6+%JC`S1MD^GF@7}MDbacLMLRm=;(osIE*Yo1( z5YW#HrRx24osxX| zIwa{_TCXqOxXGWve?0d4^gIUdSAFTSG6o;FW`scg=B(O3Bz$>dN3;i>Tj%GG#QKbL ztJb)D$T~*V7*jJoCsuRp@(z^0DQ|_4Cm_lplY) zjxHGK>HdX>PegS=^SC9i4%|R7t#34PX5t|RuUo%*`Df^JQ2l6qVa^qX{>}A@yiA7P znmna`GX~$kLxab520w08==tLee)B~`_FnY)L86{l&!Unm_t8E#qvQDJD5iVc>_xxV zL+3>KlHSP=uA#n^m!1R+FaTfm`%x0Rwe8E;?`Y*WwR)rblib%Wz&-&^-~~bWho5q! zDiS3dTujfQj&zl6J ziken1s98a8A|gTbMWSAf1hWr(IYIJ8>I^~9B1pHz(#*)~Nr90! z2#^CXsgVR{4UuF}C6ZC*M8O1KsM&``wSfdPh{)`V%)Ux9OeCb1gTW;7^?47Ba1TN5 Qe+Js~NS@I+_&=n-0B{V`O#lD@ literal 0 HcmV?d00001 diff --git a/tests/hiphop.centroid.translation b/tests/hiphop.centroid.translation new file mode 100644 index 0000000000000000000000000000000000000000..6a892e185ec8dce628b6f90fbc0cd1dea24bcf33 GIT binary patch literal 4869 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 O_}>it`H6&o<@^nHzqZi; literal 0 HcmV?d00001 diff --git a/tests/hiphop.density.translation b/tests/hiphop.density.translation new file mode 100644 index 0000000000000000000000000000000000000000..f1c1faa852a7b97872a1dfa86b4d67a73ff0acd8 GIT binary patch literal 4560 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 KpPvZ$H_qS4@3tub literal 0 HcmV?d00001 diff --git a/tests/hiphop.f1.translation b/tests/hiphop.f1.translation new file mode 100644 index 0000000000000000000000000000000000000000..e4cf88469c8ef411eb9818575855db667870e6af GIT binary patch literal 4555 zcmcgwX-rgC6n^503PH5ER4i4ixZ%7v!!W2-Dq;-oxYQ6M%kX3$aAs6A1eajzQmGY- zVqMT8T17>JNJK4yT18u}3w5iKN~}wZMvaPE>^b+nYfs5-()34Pa_%|jyWjclx%bWT zX2K?g1xxzX415dS-T^;8)ft~0KVOZRY>%=zlA@gPDK?!dNlhW@J3y^mT2(swE%+}2 zSKxF4v#XAj*>}x~UJ#}x z&9+0eeRh)Sh)9{E+U@Z%s?-K%;-VaJ5zeUSBvo>QG3 zU39D`ct0=`*dVYVu#sS6z{0?=Zkp~f=GP3sVhEl9ajKrr(S16Z$GXKNUrJ)GnMJTQ z5U(eB9>fKDUI>0aSSeVAj-kd`5?AYS4fy+DPr+V-A+H&nC3<(=V~ke^$h$Yf5cdVl z56lEMR4|VmyhiAAq2MR$@eJL^fKSk4z78@-A1{_`ukX?bDn~KN%+lNB*`7D6Bt%>*FCNF10r?WkAv6-mIjtVaIDFMd^y2ZL5v?aK43WzL#xa#G(^rT z)aP&>LWaLOGPZvh!Jig4?^Zx^&MUQg#IAxGtVQb-ykr;diRYZ>v7#~~hwwZej&8qL zz)Lg_-yBYO-qx3$rx70S``VTgj|+sy@lDAkWibN&g6-Xk;()~a;`}?cY2RiE__nWR z{V`6UpBoyx5?_;zb&6fwMwJWrbMGaucrC!AEmM8_3h?*S&Sabt=#N{G6+A(JAC<4) z8ZOW|H?w{jzMmTRx$WG?g?0hobo+tbOK=YL!{mK7fsV1V!nKtEKT*)@Zn{9{LD!Tb z{CsNMPe$9C4l@P#q|Bk?eiP`2x7+wdv;gn%taxP?f1-}>gI`*wcHmoP>a=rb5 zn=71z$MGrYj=25;d{ce&lLmtG{>v*{uCoxl#=Us^3z9>~`n=qxUqg)mf9>PE*_HIi zb=4x*7thGPhU`t*sgQckbH?OEWD?%ub*EqMCwhGS`di=4??vi4?tSvbj^hIU>%phn z;CBc=N6x?Wdr6C>1c#9AZ;{QIy_NKlKEQR!9+LC=lWvziBL(=y5Bi+QAUM~}eA9aZ zz;FAQmT-3BQNj8ycP`E@%CLC>mtx^{Zn5#PoUGJW8K6c0qz~*b$dS10SbFP z^tL?TYbNWudwI4UN$NSzvw8lzI|wgih)-91e&qdfp7*LfkEW7!24`QHk|59u*oGV;TNZ;XICyuRE@!3Gjs4)~=oe=Y1V4KM{=2wOmJ9{p#>K zl5<_JX^UeQ3UJr08`m}?`{4ZP%E7$V0)E5Qr+e}FjjzY~QHk^0{UG3v?$iFEhk!pb zyxX}M0=(cyW9|mQK7-0`T*@cH?y?@8AoQTnAz@3Y+oi+lg-F9C^*V8(@}6V7?Cdr zviLvU9mT}X#GmyLpzRJj(KHne*E%$5INP0(@%`B@v~B}gt&t&Gl@YsAWTvm5Fx#DW z7Yy1dX$tHd*d5o;#KKO4-Cu?6TG!Fe)5K07ko92DG?|XV&X%2zqUrlHWu32`u-0dQ Og#TpV`zH+k#`zORG`1c9 literal 0 HcmV?d00001 diff --git a/tests/hiphop.f10.translation b/tests/hiphop.f10.translation new file mode 100644 index 0000000000000000000000000000000000000000..36b8f5c8066430c83b832c60b42eb9f174309ef4 GIT binary patch literal 4556 zcmb_gd2mfv7{7uNOD2}aQXxepwz&7cEg>ZpF~%CPG-HfNUassf@!pe$$;8rVEfp#n zOD&-hN^F@3BWT1@LQ5^Ftz^omr455238mk6-aY1PdOGbN?##FS&hJ~!xo^4eg^vpl zk@Tw(*mrb!7wni+XMA$}EG=fdJ<8@tigL!M*mSBSH3ZMGG&85t^l9HW;Qw&kfzuwu zt~pX>*sWS*Qi?SyDbkq|>9A@xP4b{?wy0!H!i;3i;fRXW98wbqScWEfft#8%!w%W@ z8A+NWG9^v3+v8(2sX45~MLFUkol((An$!})=o!{T&8Y)T0dP3&@wQl3L5I~IpXvlq zk{Wn?ouF1bL0%FwuJG7Ja zfr549;59^F8xD57?oZKe4A=zSM{cU_r|EVM*w4s1a`5^Buv`I-Yk34O0KZU=4}dKr zYZb&l2Yw~Ub%J3nynd~R-K`h9Sbx{mI_D|aI>K+{CP^M3?Ljc3t8QtwA7K6u5cpUgPkaUntf@4k=#ES^F41D~&@d3#NA4X+z{?*i(h58z< zgUj$2heq`YC-~Fi#+?gD%z68*p0Udy2Xj%{hs@uOd*U(Yc`iPhnM-({4@b0_C*UQT z2XB}}c;42!4iSXM=f1kJ#PdAiaeRGpNokCLKYL5(-ElzTb8-Hi+v(qB3;4FLr~f%x zP=EFC*d_RytY4?tt>v&X0soVG$%|hK@aTYve!T?v`{}1MPYUXfUYs2gCcqCX*KQ6L z)Hyq?b|Jo>>d(3P?8k+60pED*f!#}R4z+`nJvKod!_jj0rULwUL65r`f;ta6rR>Jf zr~30`wy0`5O@NQf8aVoQLH$Xs)_oZ*z`H#wUeb}^FamoWubtiDVt+DE=xXbZ{UqkR zHL>kZmXQ3yLccEMB<8%f@e^t;lX++6d>*<@z%%#mcl!q6l?0D@xL&}!@Q_c+|^-8ZzI`D|Zkiz!6N6SBUg5Z4al6Gq=nvs2nEpc7iOk3A zYP;QQo{@b8?Mm6El6=l{#^gq35#GF2r|ODGJ>I|e=J&IDkbI7NpQzb-Ou&CR;8b(` z4&mp>`4|5vd1nE^!DaiKYcu3*B6DQ)b)UbJ#615*%S)}N3h)ab^gNzPa9%g-wQm@} zZ{~$^?1m7=zeI2=MpPNMZ zS$8{LXiIqJ9Pd^>BbL15 z1$?)LE51q-;Nj~h%J|I5_r>dY`>l+16Vz|^b1x-NP^Uq=>aoEB+&k3k)+|y7DD3s% z8}NLWne_GWYTaTe$>+S*jq~5zN_e3`KArISk#_vI}Y@Lyedx(lD*ct6gMN}Sc|M*)9C&o&P|1^j7~ zI-i{)zzcpdtX?bFXK?BDi}|GfjnHua-6ZC7SmR3{w;=f(zdkte{s94QeAIHJEWowc zpze!e?fHSD70kuJ4zN?xEeT8bASv9ap zjF@FKn5DOSGPD|;j|rzTtJu+Oc4^#~1^R+EF>S%AEJkEnROYjNS!A5t%%+tCabL0# zPewLk9oc|&WFvB9mMdErZoz#iGUEqgeMLo%!cInEcSkYd`6%pOC@zk!S#BWXyEMCZ zN&w>r;)IHhV0R?|r{x;ED;Ab(X1K}K7iU(C3}KTi28OfyqR3cNX5Dd*_*VwLf5PE^ GoWB4UNVYNn literal 0 HcmV?d00001 diff --git a/tests/hiphop.f2.translation b/tests/hiphop.f2.translation new file mode 100644 index 0000000000000000000000000000000000000000..e591af110119d9f19a7f8577851975e92c9f9d14 GIT binary patch literal 4555 zcmeHLYfMyE5WXU)t3nVdJ}OAn3OMBSOjHpF?RMA$eNKvVhO016-jS>a4*g5MRGbN`lk% z?%sQMl?#-?f;{ZO_K@)w*m)+4E>V{z#w?W72D4sm(HRZ0R1ms@SLB{OI^OM5s1z`%B&F$qTod54C+KtU>S*`*{s%zW}znpwhU2l1J|Ta zmLOY7){AD9F-4RlU5qI7ftfh9IZkC!N9#qw5yI$XO@e5ViC#dMEt1ZleOb_~k#r^t zkb=++FdSf8W74>ByfaWGsns8-g@zZu!Ci8 z1Xv${KVT9d2rvUM8^Dg5FnVwnRSva^Vx8Pcvu&X@!r7s0Q><{ zIP*-y#&mfu6zoFTUn1KWu<^3bv?ke4k?nG@pObl}VdG2SaydMkDwXWZPMR!IrZ~G zwd>e5*|ko&o#V`Ej{dW|iEE#8_~?n@-lIAEJE`X~&T#6_U7H;o#^H~RzkYKXr_P1g z_SNkB)V0r@7e28{9KHXo`;r^y9NMRjKVab0nQ)>;(Tl^MDjsUIEQeo^HD&IfocfXdwtgMW;fFsdUpJWW(1Ptc&R;gDZW8GyBu}&N5Q$N@MLXb3 z1+GMzCm;qLGvCIaCBFHQkw8gm|fr%BGhqo z-z_y>oJs0cU5`Bcki?K;+wTFf=;Ud_W8W16@@spOeTNlBt!DQhTpM*|dD&wEN&asu zDpk!S#&w)+_sPTaAV2kYAK; zjvLG23)-U}cM=}^uRhUp^F+coIhF5fBQdzPKCko{)7iw~pL<$v3?cntU9nWr_Jr&! zu*A5>kL07y5|gXSBD&1YXFJMBJzT&2=8tJ3Nj~!Kr`vX)Qn~dv2NB2uP~rr^$`(&e*Q7e z`gXT3CzTUjgTo(pHxeDLuSjZYTtjro=YIUOp1nule)0M`-XN{e6Mfd5!Ixc$E+EIf zpC^g2p7mzXWg+BAv&!4QPlUTvpIUZ?i;^J;qc0W za9{S$iTlDj?%tcUcAWaXe;qx(kW;7IfR_0|9Ns;|?N%D80}|Wy;5G4SNdQ^b$<3wj z43dvJ7l)#^cN1Mmpyv?w{)qje&VBv-U=7OV_%ikr-IpgE!Gh>JUg gj6(qzf%En8_4R%8`Q`*(lM`V7WU%j#68^^d2hReq+5i9m literal 0 HcmV?d00001 diff --git a/tests/hiphop.f3.translation b/tests/hiphop.f3.translation new file mode 100644 index 0000000000000000000000000000000000000000..45162821353c6a6230c0a9e588fd24053f3035ed GIT binary patch literal 4555 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 literal 0 HcmV?d00001 diff --git a/tests/hiphop.f6.translation b/tests/hiphop.f6.translation new file mode 100644 index 0000000000000000000000000000000000000000..1707f33d7a32bf1b0a2a774791bf9f5d73c205a5 GIT binary patch literal 4555 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 literal 0 HcmV?d00001 diff --git a/tests/hiphop.f9.translation b/tests/hiphop.f9.translation new file mode 100644 index 0000000000000000000000000000000000000000..5b7e8e86c0a0c478da5bfd0b8989b3ae0055ee2e GIT binary patch literal 4555 zcma)A32;qk6npyj{YRs=-hlq9^B*LbG#krM>|_An*rHGcdR2 zaZPkPw3rl^!=4i3b;Wobno~0b&^4z$RWo2ks^;<7<28?=HYBVkvJuU}-7wj?Eb1>x9fU`s&pnHt*Y65wiDj4EnfQ5spU_Auu z$ib_(zSa-?a6KNY`#A7PdW_sOJ)WfdY2d#m>&U_DTflMzIIiUrya3`tJ>La>A6Yv_ z;!_Zpfn6aOYT@-)73_AE+{b$NUZHaygMUu=HT(>Q0I+6YSkXrJv^os1a4;3D2Uu?~ zT<-^dh#qtPNXW;4#S%OLVkcNSSSG=-CJXX81e*^re%yqB-XG2f^(?sY24}*=qLwD{p$$uLj~<`X9#rewRCO4&!?*W zWY#ZlGG2fW%jz-cZ-M^khReQ>72s{36wPfxaA<)&$4jR+Kiie`6P4%KxRd0ZwNySVAnV|B^gL-NPX#?K$VH|K53o7bs3 zssD5Oj+h%H=leX_UeWI+=@Y+taqYNY#l}{IUov6CO8j2n`?y!_S-OPm%k{R|R+M@P zkK-dUJPDlz`0~owN3RIZ``>qkbO|FS{MBhuvg1Xq*5)^J#}enFQy$S+7Hf0Q{zp zQAsC;?iK9sck|4IBEq{+^VXe3gva;ypHO~f4&iY;=ZmLh_#VOM<cGFofh>ukc#Lqv52E&oi)Ro$@h+?@mcRmL}*^E?d23H{o&J&&U0oK0v_t ztG?)mNdi22`A7-hIr&^%Cpc_zyq`e7?)i?!e1T52rWHdY1bA>%(Df-q2Po`$2(>=l zY$p2#1U0JPhtzXkqnfKfUPpLQ-9uX9`y=m{^MdDZdN7jg({15}5lI5Q-kU>B_|C}d zx0mhkTp~GytiMeep4s@93g>ZraK%A6U4SRusO#T|;JmLL`wm6odo9;7EO@aym*iYG zXw;1OX#(7T)w0Dk$Q+zMM&6OXK)`=>@$qJSf8+aczCC$L!`}t`{v8_M4;1jnk8X8x ztN<_gL&;kzm@}f}%GuRK|7uip_!g4$J{*Z959^b9j$i4Oe0P@sS06MOAPI0SzI(fe z0{zm;?`j_-edC{ut-($KCWT9q^nrJy&4f(j|MQWfNH)03W@M_8nIU+WWyDR2igzR4 z-?zKMn6lXd9HSMPvJsVy78Wz*cWULgYO+NEreb6}DtMQyM!bK(q(()?UDUT~66--` zI!2kPnQ#h;^+PqyY%UAy)*@l&CJQoc3hr)I*y)iTtn38LHtbenJ^R#Dwxe0WT2;kb zvkhaj8GAFa*rFn0vM|JCg;m1)|L zqnNNOmCdUvEVd%k%%--mt}JX8-;BOK6<;R`>dQ<=W=xZW=c%&OP}vlU2@#XbI%g9} oma5N{Y(+$2{Y$=>=_^b}_Wg|5^Wb|bjKIYIWZ>^lH2fRqKjCq=hX4Qo literal 0 HcmV?d00001 diff --git a/tests/hiphop.flatness.translation b/tests/hiphop.flatness.translation new file mode 100644 index 0000000000000000000000000000000000000000..ec54cc1b3183d60cfd7c9c414b15a20193cc10ed GIT binary patch literal 4921 zcma)A3vgA%8NNgU1SAa)0hM4>lpq?;KF&)Jq9GlN@(O|sbqvYPCAlQIN$$O&K$%cz zd{6|TXfzZ75y6%yj|qt-#bOYwKnGeNg^G|WgDBI$l#CKY?7w@?GJiAM8PCk0|KD%F z|G9h4B*~eYlNIovuAsa5avSJLa@i zBNP|_W_d|v6uhIAC81bu+1yYx8ZHP0dcjUnUaTlLo|j(|3iO6$er2#Y6!(E10L0?a zaHP-+7z;+j<#7N5fi58Tg2)^Xj~uC+L2gMfLQ4Z#f(y_89aSQ1iZKZ-nwSkEj6fq2 zNCV(QkRRXyB?q4Z`VJo(3OWOXgFFn93G!2rCqZ&Rgr69^(D->4umXh70lVB^&-L{} zv@d*@p!JK$R&iG#>=m%rp!Ei@H~Z^4&^tli2Wj>(5#unjTYS3}^w%KmAlE~KZl24`pta(?A51Ac z>H7-qpseS%W@~sU%l1|M3-MAeJ<)HUhF5Gow*CdgOATJTy&CaU-T!>EA!QUSRDB9x zSK822qv0>wGGzN;D7rKM{JD95KB3`9epm5*C8|TkuN_~wJVz6!KB4#HX_|U|@m1-v z1sXixnVvpY6aVgchpOr{@h2`@k#$uQ=L7QT*`OxQk=Y$ff2N7^_K~OSwrcqNi;K~_ zHFM|~OLp9+iNp3aCy95n^E~%&zW>5*O`MB^%eGSuzv|Z3{Zif){ic5T78D;S@*b~Ubo=qAQ9aqU!FT&>?)#d;fqz+r;?~ur-}M$+t9bpx)2@o| zoa%f2>KC#XX?WI%k>@5LUPI=jOQjm#slVowt5`x$9hM#VK*M`$e%a9yG^eIdXYMXS z@xhe+?g(xAXgI=E-3e&zvGpNbpWo^-VW#T~t^><@>~TJhoq zHMs{+|4Ux~Vd28+^^wZAN5HuhU!xMQqS z`UfV9r}o*7 z)+%1z*~}|d$WPTdVQi1qp0H4LMoWqhzN4v=wrqNP4dSV|kIef0yr_nsaLX&N?$F>l z>!uqPszb#|O@FQM*P6O}{^J31Srezrz_ux~GAz4PX(HM17<8K%+%mX8{c@X8|p*V z@eFO;@N*6S#;Nvg6E*z2;st$nY4}eJ?{{gChCh4ekR!`A_~yT{TJih4x}OkIz6Y62 zr;pD?@y}%EWW0#hs_tO8=|6puzrs&HR{ZrqG$)1g%e|j`T*D6)jvjhZ6Ti9R-Bc?~TxxZynCbt}yQ!of|Y$mrX=9qGebHfx{hGTOgIhNsak(3xVH)K-F zvZj|u;z|TE5<>8EzQ{sZZXpozZcWrFSiI^B=Cil)1Zk=opE+iBSTW|s3MhcDtr{kTwVM{Nl zlrwn&ph0>42({q`2rtO(ojVLl&JYG@c~f<47`@;y7?emsIUKG`0hTSt;@IBpB@7Nn zAdJIJ@>;fRIXdE+CKZFC)P|}BhY-t~p=-JFwIZhNa_Mfkw&Atox~`Z8p>SL>y8!`( z!8n6U3I+hSyhwyuCKZQ5O^eA~Fc#{)l@_;{>;n3e(|}X5h=?ON+#3|k(mMi+$a*M{ aywicV-FsneI5#IC{%<6{M>+6Mv;P9!r3GpL literal 0 HcmV?d00001 diff --git a/tests/hiphop.fourfloor.translation b/tests/hiphop.fourfloor.translation new file mode 100644 index 0000000000000000000000000000000000000000..0215e350e84e576e7f00054504a2d1e8539bc2af GIT binary patch literal 4562 zcmcgwX-rgC6n^503&EwhR4i4ixD@BT8HPcvQW0ZZ5tkZc#9?@>!wk-h774*6*t%3| z)#6eYw1`$w&>&h-tGLvy)hbfADyhc0v}n{KsMVfx-@Epd+$K$b^d;w>bH4kX@1A?# zEN>=iY*e_UUk$)F((MiKqf^PUz;kH{niB5-3m8AL*eVzNeeMR*a>uc~| z1m3`D2j)`U&gm|j8f|yltoCS+Gumxa9jfF*=N#4)Rl}VzE>~i#Dm8sC$h0H3hI(f+sFwpF!raZZ65^ zlbCB}6Kpxet4W>f{>h?_-tDc>?|!;WzM-BpU^qVve54+8{shP;gT)X$0b&PO8dxU5u_g=hg#=pyF@EXM28{V__QziL?gVth^3)hYIBG4zmt|KZ(~MK1(+jAcS#PXYdR+Ud*_0{u~o zvcn?<_(A#VjX?sPvvIWx@cmS`&rN4PC~yh*rknR&eu8tT9VqW~2y~1`%DkHh@MHPi z?qmpb?ss$+;pbD`elnX^wuuwqW3vW~`cf*&62o5c<*YTQJ?aTX; zej--cw(li5=dF%!d!mHY7Ze1(RYr2oYm+#><`U_5=CY3?whDOWUVUy|C%lrd(GS)M zc$dG6O66yQer)#$sa(MOa;Ed#P@-3Qb<)0vB!?2V-<@jS(c=W?eV4RdbE+xXcVzC= z1^D^H*XF!ktFn9bC-pzg*%N(>Tc%@JA<{FYi$ojn4tk=s* z0sbPubG;+!kL#*M-Zj-^U;PW6TNP5zd7jvu=q$pUyYl3-T||$sUwh-*^lqe{0Q zU;g?!e91M(PWV}OI$UT&c;;pPEdxl-^$Ko;JswBu_lVJm5RJg z`w5ThzBl!&v=IWnSN-Lm&k*2I>n0fRnUn8}>-Yz*i1!lcH~q1voGZ|&*S2a*m;m>W z@Vl8#bb!KM58W+K3(aI*AHP=3hmd;CYt=CC%`Jo%(LbOgK0oq)InRH|j)xP-I{lVi z8lNQ48(i2u7@rw={qBlA?kgmRkoC7C!@U51uy7v7M^_zH(gb+Yt)||s2+sT3bLdz& zKG$*`Y3cL*D@o3E{U*+hpDn<>H?CdLfb4_wCo6k$mkRhVFFz^7=Qq9{=UbE0TYfL# z5AV_XfvuOvDFQtI2ji+Wf_;XSUMtTd`qv|(f{IAa`>-XJK59f}@4u7RIq4q8PAB8|6@BDn{feO6XrP(^pI(hy-hV##ESs5!DnE8-q2D z7Bfx=8!gzOVlm+us>KA?II^}Pa%79P3ihuU7~jm+3S}Ibtzu@oGqHV{P)#-?)1cre z%S=bX(O^Wr9LnPVbaxaJJCk76Lx{FJ>_pR4G+gV@q~UCLM#c|jyU@A~Wwl0zXjMk+ zN|Bkqe!^^b+FdYcr=%&cb6|H|KNAZ(4R(JOwrgESJ5Likfl$_iLDOV93OieNK8mIv X%#?M$cEVbpArk(ff$yIv_&4WI%f7mt literal 0 HcmV?d00001 diff --git a/tests/hiphop.highRatio.translation b/tests/hiphop.highRatio.translation new file mode 100644 index 0000000000000000000000000000000000000000..c6f3ffdb2709d0b83b4aa468f16ef4bd3beb32ce GIT binary patch literal 4922 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 D9)@UW literal 0 HcmV?d00001 diff --git a/tests/hiphop.lowRatio.translation b/tests/hiphop.lowRatio.translation new file mode 100644 index 0000000000000000000000000000000000000000..476ff89265cf689c39775696f3d2c730a174ba3c GIT binary patch literal 4921 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 rc1rX$mD#H%Ti6NvVx})gA|fm7HS(PsyDLl>9b8 literal 0 HcmV?d00001 diff --git a/tests/hiphop.s.translation b/tests/hiphop.s.translation new file mode 100644 index 0000000000000000000000000000000000000000..64dd15147b3c2df476e8e916226ceaacf655c05e GIT binary patch literal 4554 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 literal 0 HcmV?d00001 diff --git a/tests/rock.centroid.translation b/tests/rock.centroid.translation new file mode 100644 index 0000000000000000000000000000000000000000..96ba3b131b2420632646511b15530a3449390dbc GIT binary patch literal 4805 zcma)A3vgA%8D5BBpb#<$5-2KDsRRPc*|X=d2U_GkB~ojHP$sp602gxQCO6!BgFp+2 zFCH=!sDjh*8jKJ}YGA;kSa}EtR%e)j*r z{h!~Sy=Ow%gtAdAeD1*7K9ufQe^8r=SH~B`W;~jztVt&-Gx20i=*n0gw1Za$4Sl;! ziH`ZdpAPUWf}~>UWL;`{tRj(|UYV%KBrDR>V>K~WK=*1Yt7A+@RL9ck%2}~AyAwt> zBF659TAQd#Av#r;h@~r%b7QGgd`66Y13Oif>8grM<+MbMb%r^uZu;z4CIs>Uq%)~_ z&8*uA)6-M&+6+L(+Cc7yWNQo=JUEJjide0u5^R+A#q&R@YKKitlV0@@m@kt`#%E-K zJ^&6u^mB_mnoMHeDuk^k?G5=>&fdTr+lH+OHVpdc&@LtTqeL$!x~@AF_Do132Tz6e zyl`EFbv0xiWD7*cZo|4G)U}=a?8Dwcvi~0RlcD_y!E@uNeJ;oE%h0}=gX@^KIH7!q zi7y~}w@~jzu)feav2~mSdl+PN4zBk~L+lZj<_1 z`c_C|h`mns_7Gji?Sp*~@>|H~;a*F)>ivt*zYOi`SlhO}%}YMk0!R_$-VoFNeM5Z! zRtGYK>a5*IZ(o_@Z^9{y1XvUDsmphN9jdjwg8yes$BY3kqQve^YPI zKQnKgA^wSBU3y)DZTw7p)5!dmQzYKtKg>_Qtlz<0|Fc*3JYNUg%whb4cRoL@BIaq` zRXpNXq^{|2%$j=&7m+;P#Kvw-5%nIraXwa0<}mf1yH@KlLlX-U5R*5vl_`@eTC)!$5mR}ISi-mZ ze|Y>N@i+C#T2f1w5xno5hH(=SZ}LLT&h_*w_crP8gu!2&`1PVrq|aH_<)SVm&h*pl zkK9sA@*BL=f2;Ef;&1BsAN}aH)x>{eRl|F_0aJJJ6A!++gVZ&1>}Vc-t%}6G{>S-k z^>^3&9vHvL=gSWaA^DE)-r0Pd_(9FiJMpn~<&7kt!S~HCta~#8Pu%J>_GSdWdFrhC z?kH~hH+dSnZT!WVh`PJiO)4pl$iwHK`(h`-%{<*Zoa_1|!5`R{+_fHgO+E8_IY8ZL z8czIrj=B4ME2;n5q^D-yLHd-JcD?xqY{Q@F`$(IHo}ZFD25&8${f{dVc=eNerxcSq z#{b&`$K)+0`OW#qPn0F~eK0bsi4gJ>OAH{oL)uzi?OeM>C0^iSK-N@7!e(^&afs|Jas@c|Uj}`Mb#kH}$T!bj$r|fBI-T+uPYD#GNRtr<%bs@BzaALhZd&eKPPh-{8X^&qKL?Uk(Jz76OsSK z_V?pIiSX~Vw)Hm;5PvgI_f5}#d;rA^uPZLB{BC;^Z~RU_{`R#_WbPgpS`N1mKhy8V zr+0U|PU;x^)W?_NEfM$^Kl@-wbp+mXQF=uY;Yt4?cpu~%YFgZ~tcZUD-{ZElnIk1v zmdhMpao4k$ZwqdD4s(>pedRI7^SI-9OnMIYWxyOqask_M9KLJcn+((=%6jzQ!ewzo%VXn?6E#}F9+rnqQI^f_cCl-(>;%SHfk=w~!w;>e#N$e8dOBV$zrB zH()mEc`o|5Egyvivwi7u$3iBhc%UN!iwiI!WB^KR$pq%(o^+XXk;A^-t3b~}T9OC0 z%WONaxsNV{1)2qD3>3yk64%8TmZrf6eIE0D!Icf#L9-GVSArI$+q6Ls5=cAX0s0iu zwYh_V&?tzqnGnL^u98eSNbO?7!s@`&%TkR=gbT!0*-3;F=mt47X_^!thlTd^sUw-= zp-iBVRk>V&U!1AUg~YU;1;%uAplmMnxER|HK!_`RZYlUm7l&-4qU$Lxa2mpwpxZ~j zKw8|jfGEf3fdi714i~5?U6=cyUU+y{d<<=C7ChxM8z+Z$pnxmz7ceOuf#RrTfqchD zo~&{rt1v13VxTc9n=R)A|7c#^v~AMCg|C`}EnkB@7K_E12llej1j-W-7`vo8cr X8HDPqfEU(9Q1-i_e@n{nA6WkdQ=$zZ literal 0 HcmV?d00001 diff --git a/tests/rock.conf.translation b/tests/rock.conf.translation new file mode 100644 index 0000000000000000000000000000000000000000..ebf68708f3930686dd9ceeead74bd751ba1d07d3 GIT binary patch literal 4509 zcma)A32YQ)6ke!Ei?lRQuvA0>RgOa0-OjNKSfm`0il`MTX$Yk)({^FITXwe`RZfvR z4ImUFXKIBago16jRPOr{5C{RZ*dh`+)h?fta= zHsg2>*5?gr4eL9FAy0v)SQ|4ekmU<{vqB!f&!F0DVW3qNPpC*7J7>U;2kLP zYQaqZ1T7HojL~c_z)pTvFh4VtmF?ARkzi&Q<&4up1`rNFFck3k^7MegoPeh=1fb2< z2&5AT<>=M3r_~HHb6in=0-HD{Tv2lTzFbl|fUyq*kEiUw;WP7TG}zc> zJCKg1z3wL43AT%2$)FD~>{NyiV|oVDG4E)wb3wc&JYd+9jCCrki$F?2)`Fn#I#@Ru zI@;!A7wqk2`-ee4W7roNZuaB$H52cyVLvwE=+hXkPB@70k79a^p~o>S9`r#n)>v`>Cg^t!`w^^-8|!lkhcyZ$7Nos_AwS;GyTK}f^kRE&fIf)XLqJah8No1& zG0L#>VGV#xGVMOVp|cQd{>xkcP@W()tylA9$-TRi8bn9b*S2?cKq*&n7=8Twq$pUXt-L%BT>ck%& ztm$a|optRQ|JPm}UiyvMgQoR9bDQ}!Jo<1ziADW$7ta~+72^Sg;?L>2JRjc+Vm_%A zt5!T`;s2eyy=)2NflB`Kl=RNsSUvc1$GzkO`y=pOBjRS$|ku z&+z5lTiuUl@nDPk9lB=7y{|3sx^>};)>+`%mWaoHvbsf_#7ha`Wef*bihu5QWU8Iv z`8`56+OfETcPjEi%h8PYpyo*NYpi~er{rnpcY*e-f8js(a(TtKjQ`V~#Y-lzJi`C- z%JKgUW&Q$RI-@3fhXp_E$`50!8DHc}s}0P--*9mq;>VW{9>e^_b^iFv_LcZsC3wq* zKbbn4*?IOmvH1QM`=Xv2HDxV+JDBlQb!X&U#us_i(;sZaZwSF(m0y1NFtevk?7QIs z%PacWRP)9|{9X}$n}3|#_-|$l-iW%4J@*)Xv}#LDI*TXj9zL=(V;18HeAndYqD2mf>%Up)Pw#&cO z$>NIlWj9xSrNVe^2ezpzX1tB*GjpdiJL%Te9gmp}Dm@1W8{Gau4RQgyvf%m?? zXZ7cdFXq<2va^ieYa&pBk50@u%JPdiZKnq3$Fh9*N8l?UXCQ_>(P_6^o+U{ETz08= zb|6Pm@hm%Bq|2x~CDdIyf_%yC#Rc2gF;T8g94tW+m*R447K=%p&uuYRTptJIxBb5m&o zsuMG+cJgvi7gVPrBO+5qiE1z=>7edhG*x|`F3OTbv(mk&61_W>_==nQqS_QmkBmJ^ z`fRBxNv6rG)I0SktCUOD&sdvElMyvjOu8Rr38$(!sOuzRO4N&98(j;9?h{49_^N)z nsXLYK9AkzozCx9#PP{IPJ`=iL3Pn>LZX5n@0`L1Y_{Yq@il)oZ literal 0 HcmV?d00001 diff --git a/tests/rock.csv b/tests/rock.csv new file mode 100644 index 0000000..b01e3c7 --- /dev/null +++ b/tests/rock.csv @@ -0,0 +1,121 @@ +ms,bpm,dembow,fourfloor,density,flatness,centroid,regularity,highRatio,lowRatio,label,conf,f0_latin_dembow,f1_fourfloor,f2_tempo_latin,f3_low,f4_flat,f5_high,f6_density,f7_centroid,f8_reg,f9_regmid,f10_dyn,s_latin,s_electronic,s_hiphop,s_rock,s_classical +1008,0.000,0.000,0.000,0.000,0.000000,0.000,0.000,0.000000,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.450,0.000,0.500 +2011,0.000,0.000,0.000,0.000,0.000000,0.000,0.000,0.000000,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.450,0.000,0.500 +3023,0.000,0.000,0.000,0.000,0.000000,0.000,0.000,0.000000,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.450,0.000,0.500 +4023,0.000,0.000,0.000,0.000,0.000000,0.000,0.000,0.000000,0.000000,unknown,0.200,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.450,0.000,0.500 +5036,0.000,0.000,0.000,0.250,0.094046,976.232,0.000,0.231524,0.005892,hiphop,0.446,0.000,0.000,0.000,0.000,0.154,0.330,0.031,0.136,0.000,0.000,0.000,0.000,0.000,0.444,0.166,0.393 +6050,76.175,0.000,0.000,4.000,0.008093,433.805,0.230,0.046573,0.049788,classical,0.587,0.000,0.000,0.000,0.000,0.000,0.000,0.500,0.000,0.230,0.460,1.000,0.103,0.057,0.582,0.150,0.702 +7065,76.586,0.000,0.000,5.000,0.009455,478.560,0.315,0.055351,0.087579,classical,0.510,0.000,0.000,0.000,0.084,0.000,0.010,0.625,0.000,0.315,0.631,1.000,0.131,0.091,0.598,0.190,0.659 +8066,76.841,0.000,0.000,5.750,0.051953,721.064,0.104,0.180571,0.042061,classical,0.470,0.000,0.000,0.000,0.000,0.067,0.237,0.719,0.063,0.104,0.208,1.000,0.114,0.026,0.524,0.313,0.589 +9075,76.983,0.000,0.000,6.750,0.020593,486.786,0.182,0.063254,0.041035,classical,0.518,0.000,0.000,0.000,0.000,0.001,0.024,0.844,0.000,0.182,0.365,1.000,0.116,0.046,0.517,0.261,0.614 +10079,76.678,0.000,0.000,7.500,0.010048,466.446,0.226,0.050118,0.103846,classical,0.475,0.000,0.000,0.000,0.120,0.000,0.000,0.938,0.000,0.226,0.451,1.000,0.141,0.074,0.526,0.281,0.593 +11093,76.577,0.000,0.000,6.250,0.023767,364.739,0.251,0.045458,0.052718,classical,0.524,0.000,0.000,0.000,0.006,0.008,0.000,0.781,0.000,0.251,0.503,1.000,0.111,0.064,0.538,0.236,0.630 +12094,76.568,0.000,0.000,7.500,0.017094,443.146,0.263,0.052218,0.037068,classical,0.488,0.000,0.000,0.000,0.000,0.000,0.004,0.938,0.000,0.263,0.525,1.000,0.109,0.066,0.508,0.282,0.588 +13105,76.568,0.000,0.000,7.500,0.008741,444.808,0.306,0.043587,0.050113,classical,0.476,0.000,0.000,0.000,0.000,0.000,0.000,0.938,0.000,0.306,0.612,1.000,0.110,0.077,0.517,0.281,0.585 +14105,76.723,0.000,0.000,5.000,0.028499,426.141,0.380,0.053840,0.062242,classical,0.499,0.000,0.000,0.000,0.027,0.018,0.007,0.625,0.000,0.380,0.760,1.000,0.119,0.099,0.602,0.192,0.654 +15117,77.064,0.000,0.000,6.000,0.029838,395.265,0.430,0.052129,0.026707,classical,0.464,0.000,0.000,0.000,0.000,0.020,0.004,0.750,0.000,0.430,0.860,1.000,0.118,0.107,0.587,0.229,0.618 +16119,77.378,0.000,0.000,6.500,0.029253,456.931,0.392,0.052401,0.120020,classical,0.426,0.000,0.000,0.000,0.156,0.019,0.004,0.813,0.000,0.392,0.784,1.000,0.162,0.121,0.603,0.248,0.606 +17132,77.697,0.000,0.000,6.000,0.027637,410.862,0.236,0.058635,0.089095,classical,0.492,0.000,0.000,0.000,0.087,0.016,0.016,0.750,0.000,0.236,0.472,1.000,0.150,0.072,0.576,0.232,0.634 +18133,77.946,0.414,0.191,8.500,0.029296,387.653,0.130,0.079750,0.025304,latin,0.504,0.414,0.191,0.000,0.000,0.019,0.054,1.000,0.000,0.130,0.259,1.000,0.689,0.099,0.388,0.319,0.571 +19137,78.008,0.441,0.214,6.750,0.032505,520.236,0.040,0.091394,0.029875,latin,0.496,0.441,0.214,0.000,0.000,0.026,0.075,0.844,0.006,0.040,0.079,1.000,0.704,0.085,0.396,0.281,0.613 +20143,78.348,0.422,0.248,5.750,0.026268,428.708,0.102,0.061869,0.063764,latin,0.645,0.422,0.248,0.000,0.031,0.013,0.022,0.719,0.000,0.102,0.203,0.000,0.708,0.117,0.450,0.224,0.304 +21143,78.753,0.439,0.220,5.000,0.042038,518.843,0.108,0.116878,0.037963,latin,0.647,0.439,0.220,0.000,0.000,0.046,0.122,0.625,0.005,0.108,0.215,0.000,0.715,0.104,0.466,0.232,0.297 +22156,78.985,0.421,0.261,6.000,0.026327,462.984,0.216,0.074294,0.023539,latin,0.636,0.421,0.261,0.000,0.000,0.013,0.044,0.750,0.000,0.216,0.433,0.000,0.710,0.146,0.471,0.240,0.278 +23157,79.399,0.409,0.278,5.750,0.049932,544.830,0.082,0.111606,0.023998,latin,0.642,0.409,0.278,0.000,0.000,0.062,0.112,0.719,0.013,0.082,0.163,0.000,0.711,0.118,0.460,0.262,0.279 +24160,79.895,0.424,0.291,5.500,0.057309,639.217,0.233,0.152209,0.045577,latin,0.632,0.424,0.291,0.000,0.000,0.078,0.186,0.688,0.040,0.233,0.467,0.000,0.727,0.160,0.501,0.284,0.249 +25170,80.227,0.422,0.278,5.000,0.044019,704.903,0.237,0.129789,0.046326,latin,0.628,0.422,0.278,0.000,0.000,0.050,0.145,0.625,0.059,0.237,0.475,0.000,0.732,0.157,0.517,0.253,0.276 +26184,80.179,0.419,0.299,4.250,0.048589,554.867,0.066,0.105016,0.023010,latin,0.634,0.419,0.299,0.000,0.000,0.060,0.100,0.531,0.016,0.066,0.131,0.000,0.729,0.121,0.502,0.202,0.331 +27185,80.123,0.409,0.313,4.250,0.027278,398.318,0.247,0.099237,0.020442,latin,0.600,0.409,0.313,0.000,0.000,0.015,0.090,0.531,0.000,0.247,0.495,0.000,0.723,0.171,0.541,0.189,0.316 +28195,80.085,0.421,0.262,5.000,0.017612,945.590,0.045,0.117278,0.007156,latin,0.648,0.421,0.262,0.000,0.000,0.000,0.122,0.625,0.127,0.045,0.090,0.000,0.729,0.103,0.479,0.256,0.303 +29208,79.922,0.426,0.326,4.500,0.010635,821.048,0.000,0.055691,0.005576,latin,0.521,0.426,0.326,0.000,0.000,0.000,0.010,0.563,0.092,0.000,0.000,0.683,0.728,0.114,0.480,0.195,0.595 +30220,79.830,0.427,0.345,4.250,0.015413,956.619,0.298,0.116512,0.007342,latin,0.498,0.427,0.345,0.000,0.000,0.000,0.121,0.531,0.130,0.298,0.595,0.766,0.727,0.195,0.544,0.228,0.569 +31233,79.830,0.410,0.277,5.000,0.015732,993.791,0.257,0.105126,0.016777,latin,0.496,0.410,0.277,0.000,0.000,0.000,0.100,0.625,0.141,0.257,0.513,0.815,0.719,0.161,0.521,0.253,0.573 +32236,79.791,0.439,0.348,5.500,0.006023,621.475,0.346,0.036727,0.006834,latin,0.510,0.439,0.348,0.000,0.000,0.000,0.000,0.688,0.035,0.346,0.691,0.825,0.733,0.208,0.518,0.215,0.582 +33250,79.791,0.415,0.346,5.500,0.021187,986.815,0.366,0.113636,0.006049,latin,0.504,0.415,0.346,0.000,0.000,0.002,0.116,0.688,0.139,0.366,0.731,0.822,0.721,0.213,0.528,0.276,0.544 +34250,130.533,0.000,0.000,5.500,0.013906,870.985,0.354,0.068016,0.011131,classical,0.504,0.000,0.000,0.000,0.000,0.000,0.033,0.688,0.106,0.354,0.708,0.806,0.000,0.338,0.383,0.243,0.565 +35262,126.624,0.000,0.000,5.500,0.018676,962.252,0.365,0.114346,0.010923,classical,0.461,0.000,0.000,0.000,0.000,0.000,0.117,0.688,0.132,0.365,0.729,0.807,0.000,0.341,0.385,0.274,0.539 +36277,126.053,0.000,0.000,5.750,0.012112,745.910,0.389,0.073439,0.005924,classical,0.482,0.000,0.000,0.000,0.000,0.000,0.043,0.719,0.070,0.389,0.778,0.807,0.000,0.347,0.384,0.246,0.551 +37288,126.059,0.000,0.000,4.750,0.005260,373.269,0.042,0.028033,0.110150,classical,0.623,0.000,0.000,0.000,0.134,0.000,0.000,0.594,0.000,0.042,0.085,0.801,0.033,0.281,0.366,0.178,0.628 +38292,126.059,0.000,0.000,5.000,0.001487,239.651,0.112,0.004474,0.043842,classical,0.612,0.000,0.000,0.000,0.000,0.000,0.000,0.625,0.000,0.112,0.224,0.786,0.000,0.278,0.347,0.188,0.608 +39305,125.777,0.000,0.000,6.500,0.165769,3207.211,0.219,0.758497,0.005550,rock,0.781,0.000,0.000,0.000,0.000,0.304,1.000,0.813,0.773,0.219,0.438,0.744,0.000,0.305,0.331,0.783,0.235 +40318,125.536,0.000,0.000,6.000,0.130908,2735.401,0.000,0.651613,0.001003,rock,0.741,0.000,0.000,0.000,0.000,0.231,1.000,0.750,0.639,0.000,0.000,0.720,0.000,0.250,0.300,0.719,0.265 +41332,125.510,0.000,0.000,4.500,0.071348,688.952,0.000,0.155078,0.174660,classical,0.494,0.000,0.000,0.000,0.277,0.107,0.191,0.563,0.054,0.000,0.000,0.722,0.069,0.292,0.393,0.256,0.555 +42394,125.593,0.457,0.175,5.250,0.066057,790.164,0.000,0.142718,0.181015,classical,0.454,0.457,0.175,0.000,0.291,0.096,0.169,0.656,0.083,0.000,0.000,0.739,0.301,0.355,0.263,0.283,0.544 +43408,125.736,0.418,0.212,5.750,0.106239,1396.723,0.000,0.386003,0.038819,rock,0.394,0.418,0.212,0.000,0.000,0.180,0.611,0.719,0.256,0.000,0.000,0.732,0.209,0.324,0.202,0.490,0.393 +44408,125.818,0.423,0.234,5.250,0.185251,1931.635,0.000,0.458400,0.068225,rock,0.494,0.423,0.234,0.000,0.040,0.344,0.743,0.656,0.409,0.000,0.000,0.752,0.222,0.338,0.221,0.574,0.376 +45419,125.866,0.412,0.237,5.000,0.024875,353.227,0.000,0.079982,0.259196,classical,0.483,0.412,0.237,0.000,0.465,0.010,0.055,0.625,0.000,0.000,0.000,0.741,0.322,0.403,0.315,0.205,0.587 +46434,125.694,0.415,0.190,3.750,0.056889,704.117,0.031,0.203879,0.168042,classical,0.462,0.415,0.190,0.000,0.262,0.077,0.280,0.469,0.058,0.031,0.061,0.728,0.273,0.363,0.311,0.251,0.551 +47435,125.606,0.433,0.201,3.500,0.128077,1303.925,0.198,0.431714,0.141359,unknown,0.261,0.433,0.201,0.000,0.203,0.225,0.694,0.438,0.230,0.198,0.396,0.711,0.267,0.400,0.334,0.431,0.411 +48435,125.606,0.440,0.182,3.250,0.191149,2292.775,0.135,0.577652,0.052598,rock,0.509,0.440,0.182,0.000,0.006,0.357,0.959,0.406,0.512,0.135,0.270,0.708,0.221,0.348,0.287,0.591,0.345 +49449,91.067,0.000,0.000,3.500,0.113475,1076.186,0.197,0.276186,0.066815,hiphop,0.550,0.000,0.000,0.000,0.037,0.195,0.411,0.438,0.165,0.197,0.393,0.717,0.259,0.055,0.659,0.325,0.499 +50462,91.047,0.000,0.000,3.000,0.105050,980.264,0.221,0.353846,0.110005,hiphop,0.617,0.000,0.000,0.000,0.133,0.177,0.552,0.375,0.137,0.221,0.442,0.639,0.283,0.075,0.696,0.339,0.442 +51462,91.124,0.000,0.000,3.750,0.061178,558.306,0.199,0.164432,0.185876,hiphop,0.661,0.000,0.000,0.000,0.302,0.086,0.208,0.469,0.017,0.199,0.398,0.318,0.325,0.095,0.706,0.220,0.412 +52477,91.397,0.000,0.000,6.000,0.032196,427.806,0.000,0.064404,0.145567,hiphop,0.556,0.000,0.000,0.000,0.212,0.025,0.026,0.750,0.000,0.000,0.000,0.193,0.303,0.032,0.592,0.237,0.372 +53479,91.606,0.000,0.000,6.250,0.070789,771.820,0.000,0.204365,0.044705,hiphop,0.515,0.000,0.000,0.000,0.000,0.106,0.281,0.781,0.078,0.000,0.000,0.148,0.250,0.000,0.544,0.354,0.272 +54492,91.716,0.000,0.000,6.000,0.082047,766.813,0.000,0.187879,0.138169,hiphop,0.554,0.000,0.000,0.000,0.196,0.129,0.251,0.750,0.076,0.000,0.000,0.152,0.299,0.029,0.589,0.339,0.290 +55506,91.779,0.000,0.000,6.000,0.049271,538.882,0.000,0.169050,0.214957,hiphop,0.592,0.000,0.000,0.000,0.367,0.061,0.216,0.750,0.011,0.000,0.000,0.110,0.342,0.055,0.623,0.302,0.286 +56508,91.773,0.000,0.000,3.250,0.064706,742.845,0.146,0.228969,0.191774,hiphop,0.700,0.000,0.000,0.000,0.315,0.093,0.325,0.406,0.069,0.146,0.293,0.074,0.329,0.084,0.711,0.251,0.312 +57521,91.870,0.000,0.000,3.250,0.126462,1329.969,0.244,0.421329,0.177271,hiphop,0.683,0.000,0.000,0.000,0.283,0.222,0.675,0.406,0.237,0.244,0.487,0.065,0.321,0.103,0.724,0.417,0.194 +58521,92.014,0.000,0.000,3.250,0.129875,1352.415,0.170,0.406212,0.181718,hiphop,0.670,0.000,0.000,0.000,0.293,0.229,0.648,0.406,0.244,0.170,0.340,0.059,0.323,0.086,0.711,0.411,0.208 +59525,92.014,0.455,0.167,3.750,0.021912,320.832,0.221,0.056104,0.091851,latin,0.725,0.455,0.167,0.000,0.093,0.004,0.011,0.469,0.000,0.221,0.441,0.061,0.851,0.127,0.555,0.145,0.379 +60539,92.043,0.467,0.175,3.500,0.109835,1114.583,0.222,0.328673,0.080641,latin,0.722,0.467,0.175,0.000,0.068,0.187,0.507,0.438,0.176,0.222,0.443,0.082,0.851,0.127,0.554,0.355,0.245 +61539,92.043,0.475,0.187,4.250,0.083968,840.255,0.014,0.220953,0.123491,latin,0.776,0.475,0.187,0.000,0.163,0.133,0.311,0.531,0.097,0.014,0.029,0.075,0.878,0.094,0.510,0.297,0.299 +62551,92.043,0.411,0.214,5.250,0.025032,300.249,0.000,0.063453,0.178208,latin,0.766,0.411,0.214,0.000,0.285,0.010,0.024,0.656,0.000,0.000,0.000,0.104,0.877,0.118,0.523,0.206,0.365 +63552,92.043,0.415,0.235,5.750,0.153008,1620.231,0.000,0.430732,0.028202,latin,0.666,0.415,0.235,0.000,0.000,0.277,0.692,0.719,0.320,0.000,0.000,0.106,0.808,0.082,0.452,0.545,0.150 +64567,92.034,0.417,0.240,5.000,0.092256,2150.228,0.000,0.491711,0.035355,latin,0.646,0.417,0.240,0.000,0.000,0.151,0.803,0.625,0.471,0.000,0.000,0.088,0.808,0.084,0.471,0.569,0.134 +65579,92.034,0.429,0.239,4.000,0.051186,688.181,0.000,0.172806,0.128278,latin,0.748,0.429,0.239,0.000,0.174,0.065,0.223,0.500,0.054,0.000,0.000,0.093,0.858,0.110,0.528,0.240,0.341 +66583,92.026,0.408,0.253,3.500,0.093807,1052.048,0.000,0.287388,0.047338,latin,0.699,0.408,0.253,0.000,0.000,0.154,0.432,0.438,0.158,0.000,0.000,0.119,0.804,0.089,0.510,0.323,0.303 +67595,92.053,0.424,0.238,3.250,0.071538,870.765,0.000,0.298586,0.130528,latin,0.732,0.424,0.238,0.000,0.179,0.107,0.452,0.406,0.106,0.000,0.000,0.155,0.857,0.110,0.549,0.300,0.317 +68596,92.172,0.414,0.224,3.500,0.109576,1078.562,0.000,0.318007,0.110992,latin,0.720,0.414,0.224,0.000,0.136,0.187,0.487,0.438,0.165,0.000,0.000,0.114,0.841,0.099,0.536,0.347,0.284 +69598,92.274,0.430,0.242,4.000,0.166998,1469.998,0.000,0.325857,0.062074,latin,0.702,0.430,0.242,0.000,0.027,0.306,0.502,0.500,0.277,0.000,0.000,0.183,0.822,0.089,0.498,0.416,0.289 +70599,92.334,0.441,0.261,4.250,0.081292,1185.890,0.000,0.346279,0.037591,latin,0.713,0.441,0.261,0.000,0.000,0.128,0.539,0.531,0.196,0.000,0.000,0.271,0.820,0.091,0.484,0.389,0.301 +71600,92.443,0.461,0.228,4.750,0.114499,1412.133,0.000,0.538661,0.067141,latin,0.694,0.461,0.228,0.000,0.038,0.197,0.888,0.594,0.261,0.000,0.000,0.267,0.840,0.085,0.474,0.539,0.178 +72604,92.443,0.464,0.223,5.250,0.143367,1605.981,0.405,0.496839,0.067280,latin,0.652,0.464,0.223,0.000,0.038,0.257,0.812,0.656,0.316,0.405,0.809,0.268,0.841,0.185,0.541,0.558,0.146 +73615,132.577,0.000,0.000,5.250,0.095108,1982.327,0.367,0.537711,0.046665,rock,0.554,0.000,0.000,0.000,0.000,0.156,0.887,0.656,0.424,0.367,0.734,0.275,0.000,0.342,0.392,0.592,0.129 +74618,131.467,0.000,0.000,6.000,0.065170,753.794,0.178,0.494681,0.121706,rock,0.456,0.000,0.000,0.000,0.159,0.094,0.809,0.750,0.073,0.178,0.355,0.285,0.040,0.318,0.367,0.500,0.152 +75627,130.819,0.000,0.000,5.500,0.114370,1517.080,0.000,0.615343,0.071525,rock,0.645,0.000,0.000,0.000,0.048,0.197,1.000,0.688,0.291,0.000,0.000,0.275,0.012,0.257,0.322,0.608,0.124 +76630,130.565,0.000,0.000,5.250,0.131392,1357.621,0.000,0.582835,0.065831,rock,0.611,0.000,0.000,0.000,0.035,0.232,0.969,0.656,0.245,0.000,0.000,0.285,0.009,0.255,0.326,0.584,0.145 +77633,130.390,0.000,0.000,6.000,0.218606,2568.119,0.000,0.658998,0.042389,rock,0.785,0.000,0.000,0.000,0.000,0.414,1.000,0.750,0.591,0.000,0.000,0.297,0.000,0.250,0.300,0.735,0.116 +78647,130.253,0.000,0.000,6.750,0.170274,1732.278,0.000,0.422632,0.014780,rock,0.636,0.000,0.000,0.000,0.000,0.313,0.678,0.844,0.352,0.000,0.000,0.262,0.000,0.250,0.281,0.591,0.178 +79648,130.210,0.000,0.000,6.250,0.192025,1930.509,0.161,0.537934,0.045368,rock,0.686,0.000,0.000,0.000,0.000,0.358,0.887,0.781,0.409,0.161,0.322,0.275,0.000,0.290,0.326,0.656,0.119 +80653,130.210,0.000,0.000,6.500,0.200480,1847.947,0.154,0.453841,0.032911,rock,0.638,0.000,0.000,0.000,0.000,0.376,0.734,0.813,0.385,0.154,0.307,0.288,0.000,0.288,0.318,0.617,0.162 +81664,88.500,0.000,0.000,6.000,0.184270,1853.712,0.257,0.506398,0.039933,rock,0.452,0.000,0.000,0.000,0.000,0.342,0.830,0.750,0.387,0.257,0.513,0.301,0.250,0.064,0.601,0.622,0.143 +82664,87.621,0.000,0.000,6.000,0.179525,1355.751,0.316,0.334919,0.046793,hiphop,0.525,0.000,0.000,0.000,0.000,0.332,0.518,0.750,0.245,0.316,0.631,0.229,0.250,0.079,0.613,0.491,0.206 +83664,87.002,0.000,0.000,7.000,0.160297,1610.782,0.099,0.419044,0.028644,rock,0.462,0.000,0.000,0.000,0.000,0.292,0.671,0.875,0.317,0.099,0.198,0.206,0.250,0.025,0.545,0.587,0.142 +84668,86.381,0.000,0.000,7.250,0.193232,2766.687,0.057,0.591461,0.060899,rock,0.711,0.000,0.000,0.000,0.024,0.361,0.984,0.906,0.648,0.057,0.115,0.162,0.256,0.018,0.535,0.783,0.029 +85681,85.953,0.000,0.000,6.500,0.203476,2815.997,0.030,0.678773,0.048672,rock,0.690,0.000,0.000,0.000,0.000,0.382,1.000,0.813,0.662,0.030,0.059,0.073,0.250,0.007,0.543,0.767,0.019 +86695,85.791,0.000,0.000,6.250,0.222513,2306.189,0.000,0.583331,0.075013,rock,0.622,0.000,0.000,0.000,0.056,0.422,0.970,0.781,0.516,0.000,0.000,0.061,0.264,0.008,0.555,0.718,0.035 +87707,85.791,0.000,0.000,5.500,0.188004,3341.320,0.148,0.686576,0.046362,rock,0.642,0.000,0.000,0.000,0.000,0.350,1.000,0.688,0.812,0.148,0.297,0.049,0.250,0.037,0.592,0.762,0.030 +88707,85.546,0.000,0.000,5.750,0.087285,1031.477,0.092,0.241802,0.060577,hiphop,0.557,0.000,0.000,0.000,0.024,0.140,0.349,0.719,0.152,0.092,0.185,0.036,0.256,0.027,0.579,0.379,0.219 +89713,85.377,0.000,0.000,6.750,0.117213,1916.847,0.098,0.467769,0.029026,rock,0.496,0.000,0.000,0.000,0.000,0.203,0.760,0.844,0.405,0.098,0.196,0.038,0.250,0.024,0.551,0.613,0.065 +90713,85.090,0.000,0.000,6.250,0.163169,2271.625,0.191,0.549806,0.055712,rock,0.548,0.000,0.000,0.000,0.013,0.298,0.909,0.781,0.506,0.191,0.382,0.032,0.253,0.050,0.585,0.678,0.024 +91715,85.017,0.000,0.000,7.250,0.137876,1700.342,0.299,0.434323,0.044369,rock,0.458,0.000,0.000,0.000,0.000,0.246,0.699,0.906,0.343,0.299,0.598,0.031,0.250,0.075,0.579,0.604,0.045 +92715,85.125,0.419,0.229,6.250,0.237641,2310.998,0.182,0.491060,0.059263,latin,0.577,0.419,0.229,0.000,0.021,0.453,0.802,0.781,0.517,0.182,0.364,0.036,0.815,0.129,0.480,0.672,0.058 +93718,85.456,0.442,0.214,4.750,0.108976,1015.908,0.407,0.254686,0.035746,latin,0.692,0.442,0.214,0.000,0.000,0.185,0.372,0.594,0.147,0.407,0.813,0.030,0.821,0.177,0.552,0.354,0.210 +94721,85.935,0.466,0.226,5.500,0.221305,2468.684,0.162,0.612412,0.051491,latin,0.571,0.466,0.226,0.000,0.003,0.419,1.000,0.688,0.562,0.162,0.325,0.027,0.834,0.120,0.479,0.710,0.021 +95734,86.309,0.429,0.230,6.250,0.083549,837.414,0.049,0.380836,0.142307,latin,0.751,0.429,0.230,0.000,0.205,0.132,0.602,0.781,0.096,0.049,0.097,0.026,0.866,0.123,0.487,0.459,0.128 +96746,86.354,0.438,0.224,6.750,0.090336,806.055,0.000,0.393931,0.128333,latin,0.753,0.438,0.224,0.000,0.174,0.147,0.625,0.844,0.087,0.000,0.000,0.024,0.862,0.104,0.457,0.485,0.110 +97758,86.244,0.416,0.244,6.500,0.084559,1156.193,0.000,0.348852,0.063809,latin,0.717,0.416,0.244,0.000,0.031,0.134,0.543,0.813,0.187,0.000,0.000,0.029,0.816,0.090,0.440,0.474,0.144 +98761,86.169,0.432,0.246,6.500,0.100929,1164.137,0.000,0.444010,0.113135,latin,0.720,0.432,0.246,0.000,0.140,0.169,0.716,0.813,0.190,0.000,0.000,0.026,0.851,0.107,0.458,0.531,0.091 +99761,86.109,0.446,0.252,6.750,0.111208,1242.862,0.000,0.482892,0.089203,latin,0.700,0.446,0.252,0.000,0.087,0.190,0.787,0.844,0.212,0.000,0.000,0.027,0.845,0.101,0.437,0.571,0.062 +100761,86.192,0.455,0.235,6.500,0.117794,1284.496,0.000,0.490760,0.051142,latin,0.688,0.455,0.235,0.000,0.003,0.204,0.801,0.813,0.224,0.000,0.000,0.006,0.828,0.083,0.424,0.571,0.059 +101766,86.442,0.430,0.221,6.250,0.236305,2246.263,0.000,0.651758,0.047472,latin,0.544,0.430,0.221,0.000,0.000,0.451,1.000,0.781,0.499,0.000,0.000,0.040,0.815,0.077,0.436,0.727,0.019 +102772,86.615,0.435,0.235,6.000,0.187874,1803.267,0.000,0.600042,0.087782,latin,0.616,0.435,0.235,0.000,0.084,0.350,1.000,0.750,0.372,0.000,0.000,0.041,0.839,0.095,0.458,0.671,0.027 +103775,86.412,0.423,0.250,5.750,0.092944,840.528,0.000,0.449998,0.122387,latin,0.733,0.423,0.250,0.000,0.161,0.152,0.727,0.719,0.097,0.000,0.000,0.040,0.852,0.112,0.483,0.481,0.116 +104789,86.193,0.484,0.254,6.500,0.093791,1261.335,0.000,0.364319,0.039076,latin,0.743,0.484,0.254,0.000,0.000,0.154,0.571,0.813,0.218,0.000,0.000,0.041,0.842,0.089,0.416,0.493,0.140 +105805,86.133,0.466,0.224,6.250,0.140927,1378.191,0.000,0.534531,0.077961,latin,0.686,0.466,0.224,0.000,0.062,0.252,0.881,0.781,0.251,0.000,0.000,0.035,0.849,0.088,0.440,0.599,0.053 +106819,86.402,0.463,0.244,6.500,0.129961,1419.177,0.000,0.657494,0.039263,latin,0.641,0.463,0.244,0.000,0.000,0.229,1.000,0.813,0.263,0.000,0.000,0.044,0.831,0.085,0.422,0.644,0.012 +107834,86.612,0.468,0.230,6.750,0.171030,1364.572,0.000,0.542583,0.067580,latin,0.664,0.468,0.230,0.000,0.039,0.315,0.896,0.844,0.247,0.000,0.000,0.050,0.844,0.086,0.422,0.631,0.038 +108835,86.733,0.417,0.241,6.000,0.136535,1463.151,0.000,0.461706,0.023112,latin,0.667,0.417,0.241,0.000,0.000,0.243,0.749,0.750,0.275,0.000,0.000,0.050,0.809,0.085,0.446,0.555,0.105 +109847,86.791,0.423,0.231,7.000,0.075165,902.331,0.000,0.338014,0.075288,latin,0.734,0.423,0.231,0.000,0.056,0.115,0.524,0.875,0.115,0.000,0.000,0.057,0.825,0.089,0.431,0.466,0.144 +110862,86.996,0.406,0.228,6.750,0.135660,1443.922,0.000,0.477148,0.069930,latin,0.654,0.406,0.228,0.000,0.044,0.241,0.777,0.844,0.270,0.000,0.000,0.057,0.814,0.086,0.439,0.590,0.076 +111865,86.996,0.428,0.227,6.250,0.104046,1034.021,0.000,0.420254,0.105818,latin,0.726,0.428,0.227,0.000,0.124,0.175,0.673,0.781,0.153,0.000,0.000,0.086,0.845,0.098,0.462,0.501,0.133 +112868,86.997,0.438,0.236,5.000,0.115936,1732.900,0.025,0.530688,0.071532,latin,0.670,0.438,0.236,0.000,0.048,0.200,0.874,0.625,0.352,0.025,0.050,0.069,0.831,0.096,0.480,0.568,0.103 +113870,86.829,0.422,0.242,4.000,0.096391,963.548,0.000,0.498007,0.113551,latin,0.717,0.422,0.242,0.000,0.141,0.159,0.815,0.500,0.132,0.000,0.000,0.079,0.846,0.106,0.523,0.451,0.158 +114871,86.608,0.426,0.174,5.000,0.097410,1035.041,0.000,0.407248,0.070110,latin,0.720,0.426,0.174,0.000,0.045,0.161,0.650,0.625,0.153,0.000,0.000,0.084,0.824,0.067,0.477,0.445,0.178 +115885,86.705,0.449,0.179,4.750,0.143565,1687.760,0.000,0.507596,0.046201,latin,0.677,0.449,0.179,0.000,0.000,0.257,0.832,0.594,0.339,0.000,0.000,0.076,0.825,0.063,0.469,0.551,0.128 +116890,86.796,0.465,0.215,5.750,0.104514,1168.172,0.000,0.437340,0.067505,latin,0.729,0.465,0.215,0.000,0.039,0.176,0.704,0.719,0.191,0.000,0.000,0.080,0.842,0.081,0.448,0.501,0.137 +117903,86.859,0.447,0.202,6.000,0.110759,1344.406,0.000,0.467353,0.049423,latin,0.694,0.447,0.202,0.000,0.000,0.189,0.759,0.750,0.241,0.000,0.000,0.066,0.823,0.071,0.438,0.541,0.108 +118915,86.849,0.440,0.217,5.750,0.135861,1231.415,0.000,0.573437,0.056052,latin,0.662,0.440,0.217,0.000,0.013,0.241,0.952,0.719,0.209,0.000,0.000,0.064,0.823,0.078,0.449,0.590,0.057 +119928,86.586,0.428,0.197,6.750,0.098921,1503.748,0.108,0.519246,0.046644,latin,0.641,0.428,0.197,0.000,0.000,0.164,0.853,0.844,0.287,0.108,0.215,0.052,0.814,0.096,0.446,0.605,0.040 +120930,86.404,0.484,0.204,5.750,0.105406,988.541,0.212,0.538570,0.108256,latin,0.719,0.484,0.204,0.000,0.129,0.178,0.888,0.719,0.140,0.212,0.425,0.057,0.874,0.144,0.504,0.544,0.053 diff --git a/tests/rock.csv.import b/tests/rock.csv.import new file mode 100644 index 0000000..dafab21 --- /dev/null +++ b/tests/rock.csv.import @@ -0,0 +1,19 @@ +[remap] + +importer="csv_translation" +type="Translation" +uid="uid://cw56huda4jabp" + +[deps] + +files=["res://tests/rock.bpm.translation", "res://tests/rock.dembow.translation", "res://tests/rock.fourfloor.translation", "res://tests/rock.density.translation", "res://tests/rock.flatness.translation", "res://tests/rock.centroid.translation", "res://tests/rock.regularity.translation", "res://tests/rock.highRatio.translation", "res://tests/rock.lowRatio.translation", "res://tests/rock.label.translation", "res://tests/rock.conf.translation", "res://tests/rock.f0.translation", "res://tests/rock.f1.translation", "res://tests/rock.f2.translation", "res://tests/rock.f3.translation", "res://tests/rock.f4.translation", "res://tests/rock.f5.translation", "res://tests/rock.f6.translation", "res://tests/rock.f7.translation", "res://tests/rock.f8.translation", "res://tests/rock.f9.translation", "res://tests/rock.f10.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation"] + +source_file="res://tests/rock.csv" +dest_files=["res://tests/rock.bpm.translation", "res://tests/rock.dembow.translation", "res://tests/rock.fourfloor.translation", "res://tests/rock.density.translation", "res://tests/rock.flatness.translation", "res://tests/rock.centroid.translation", "res://tests/rock.regularity.translation", "res://tests/rock.highRatio.translation", "res://tests/rock.lowRatio.translation", "res://tests/rock.label.translation", "res://tests/rock.conf.translation", "res://tests/rock.f0.translation", "res://tests/rock.f1.translation", "res://tests/rock.f2.translation", "res://tests/rock.f3.translation", "res://tests/rock.f4.translation", "res://tests/rock.f5.translation", "res://tests/rock.f6.translation", "res://tests/rock.f7.translation", "res://tests/rock.f8.translation", "res://tests/rock.f9.translation", "res://tests/rock.f10.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation", "res://tests/rock.s.translation"] + +[params] + +compress=1 +delimiter=0 +unescape_keys=false +unescape_translations=true diff --git a/tests/rock.dembow.translation b/tests/rock.dembow.translation new file mode 100644 index 0000000000000000000000000000000000000000..1a0f01dd9e830410cf6f37464086e9cc7695afcf GIT binary patch literal 4511 zcmcgw2~1R16dl0@s31{PL~4yvK|q`tJ_D#lMKqOKYpGH~jI19R8D?;1K&6UnUCfm&0SD%zr@k>30Mf9B@rH>ok{Pwu>X&pmf}@BQUL z%x5vcd&7u-XMb%zCeYo2Rn>l5uiuOb~M4K5`t06kZ z)q;H#1AIfp~%pkTK-@$htp_0>}vB8w2_TVow4+ z1|*JPm}7=)XTWF$nWOOMgS`}_E9~7skOI)5H71#Lj*(ageJG$Z{B-!F>|!8se4;t8 z*F|FUc+Vo;rp3sqF;_)1BE#B*Ph46X3nm_CZ4imm9qKDU6V)OWlNT;Uh zU?}r`>SX!$Jju)Xw_0mf;k~Eihab9qtyBeXukstajnw7+jbHn&`#{1sOe^=mdsUhD zqqb&oJ&6YjTa#ta{GQHJ!B+=3FWsZk_puFy{-adzYTd1dNELj+^0;L;RPY`(-3r4< zpZMv)p6c5kl?@>LUq=k={~NIa(nRk9>#4q^Fa-7H4A3hoBM&i4S zjR~kEHlI)8gE}p~>v?=-_}1h24&%04@-Sa~=DE%DuU!AK8Q+T>KahSoR zn`gb6OyW7deo=$_eigpst)FJr5I(OL(_~$a-*CPUKC?pv0p?54f%%d|oH?;^({Y48i$ZGD=UKBKCsWqj$EF zx_lnH8^%1t^9qmK^YdJXzlqIxan12Zo)Emgy0Rgb-)x9=P|%a7bQy#B^fx(YMN$MKOZM~c58 ze7=`4g0DNh*78O(CBu2?o9m?6U3u8a_Z zy$J?ZE0pOvHW#Uij^TP~rcx(t1*EkKW^VvsUO>%b7Ll%L^Je(8SDGhASG4J@a?qSzh@ Sdd7$R_}>YgLA^yqMXOegQ7a18ntD{x7L`W&-u(0Abuvvl$(#SZ?|tw1|9@uohv?6v z$Lo}(r}7zkeN?85bD zX1g=kIMMzf164j>l^pU6^;HYLqs)H_^oxppjp6DzZr@Syo+$Q96^=1But9bp6z{}z7e#ktm2}rqu?P0zerej=!WF*obwpgV71Z6=Z;dA>TvMy|%~pLB7;cTt^pL3;SF_|6he@%4vKMmVwfF5{wo zDw$35iGNt&v-43r*j9h{;5tuyXRD(y`4YBue?!Oevt8RA6d744y!})H;S{~ zOkweaZ&=dkykCQFd-LbC8pfx3(M{$&{0*ml@W?8il+5C3pO1JBck>xe^XYAWr{`>j53V&;1+cvIz4Q)k ztq5kkeiQmM=Q7@|n5DB9Gke6ts{JpS4XXSe)O9NDSI+Vf-WHYq2cFy1^UPShZ`M5x z`~%+!wpUnw+JAjRw25-ynBp+B^)`!d+c_%Bi#<0~f79sU6-Jhi@KN`UZ26Y)Y2C(G zcn0BljcPepWn9Q)Jc@U`xo^%5#v^>pkRhk>Y)kQkpPOs?=_7_yy%$Xmc0Cy$Q!>e6 zsYbo8UO%03U!z{hsuK(F46UwrY=K4ZtHHk%R`3ANTWbCTolol>4SvIpGx{_Qe)sil z2RAW3&8PR4)mQL5OZoHft@+T8#S`yp+Kv%dS@YdTTKc#uMVt~M{Lb{VLFU%K*8 z-$w(#JOA90dRCwE^jm1jcV+eP@4)v#EA@aV2$nzqv$cYujYVZuiL=N>JR#H^NSx_E3(M!5mH&I34Lhr!we+Bs5N5lVS{sAg(%fA2s literal 0 HcmV?d00001 diff --git a/tests/rock.f0.translation b/tests/rock.f0.translation new file mode 100644 index 0000000000000000000000000000000000000000..8a8350c2bb33c969e3d0f0ef3ba7630dd80a5813 GIT binary patch literal 4507 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 literal 0 HcmV?d00001 diff --git a/tests/rock.f2.translation b/tests/rock.f2.translation new file mode 100644 index 0000000000000000000000000000000000000000..067fbf1cdf4b42bb3560271a0c27da72b0c88f70 GIT binary patch literal 4507 zcmeHLc}!Gi5MRM#p|TQ1MM^DEDhP-x^+GKwqN&tUyH#q45f*%~3(GF-TRc$l21P^E zDw=X=C?ZxPP>2Wh78Mn(S~W(jAfPq%sG==e8tKgX#!Oyblm6ZKlHr@*Z+B8I@R=rs?>1{@fS(2($j^O!sz87)v!j?sE$^YOu zfyN!oDu|XeYn%{mvc&04(Kbu87$=wom4?U6`eZ?c8Oeeu>JtP})eV3>Ls0brH^r1@ zg=}k@Nf4tg^8~BaI9E`;2N8o_G(_9#Yi%kH33d7UD*MZGq9M+g4 zVFQd-um!Ss2H;g-UE$h!fn|daQ?pxAjbkYG!5A92cK&Sew3I>+5kJ+O-s=*>l<%H9 zEH7WmMJ@5g?w%KMUX)LKYvF#)Ri>wYRe#tH9c6k`NDq(m3{!qtsJdx30D0Xn)t2w- zSY6WBw^psgdrz(pK63kdu>#*-;X82$>r3;Syzv89FQy+kv(ydmRe9ad+M0#UEFUEH zHOYML`)siSzuwzoz% zopVyX_c9(_dmq6u-u9Z+jrzQc2A@TF-6csO_wbn|p7Lvto(|Qp{4Nu9{^bnQ`NTY| z(c-(F^2>v_pTu_Zm`FfsY{MLY8&ske`(_dZ0cu2L^zxv1}T+4XF5ZirER+n@a zU9R_xVY=3av+0A_{Hae)htG77y*+=*UvsOt^f1%kIks`rJl2QuZ{?@Hj$rx3Z(iQu zdQd^{SpRck71L8cU6VBnzu|Npyi<#(&Sm*@omcMcUxwc*(ruafDkGEO1npyYeE(CN z=F>1LbO-Jo4>jh=$f`cfj4z@pK@G*-yV~Yhu?3S z7u6|sEBGc>fv?Ps^!HY%6S%PPZZ_lTe0n=I_KauzplVA+5UWe?OTW==Wh0rc-{d~c z=}fmLaz*?yhChB-aquO>;M$*qnoh<2N?9G^+ryK7$99lnA4)be-tp;@fxd7 z*WXyDvrr8j6P$;%-C_CdyT_*bvipYmZyPtP%*^T$Kepvq;kQgr>o%#(X9VuosF!O+ z@}(4}qkNb81M_Y%9r5D_4?c@~TgoT?!hFk5pE92My=Zb)_hfuz(NyOZ3jJ39^)%wX zLcgN5r{q`RK@ty^WCie-3B2!h@UzT6$biIz literal 0 HcmV?d00001 diff --git a/tests/rock.f3.translation b/tests/rock.f3.translation new file mode 100644 index 0000000000000000000000000000000000000000..9f45cac0867c564a47908e23d512d5bbd5b0bf32 GIT binary patch literal 4507 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 literal 0 HcmV?d00001 diff --git a/tests/rock.f5.translation b/tests/rock.f5.translation new file mode 100644 index 0000000000000000000000000000000000000000..c827b570e7d597671551d94cb585bdda53543351 GIT binary patch literal 4507 zcma)A32YQ)6kaGti?lRQu+)kKDp#TG%Bj_&;P`vpqBVb z0}vf3^%=oz|70T&@Qybe4}qsJCs>#r%E|Q^j%YA*OY%Z57>dDXXb-g zuyK!xAl)p!z7|^sTVq%%=tE39o#CUHp2c*mI}Yr85T6APnD$h2oeAqwkaCa>AQ-y| z)~%+Fw)NNpzJ1Jp1oSheeUahTIBs9H@P0P!dlnpHn!~k;1flpCrpK9j0>hF(PhmF3 zxxr2a8DhcFmu_M&FkhCb7n*CaxrSh!W9k@-#}bQ;SUJPifL;MoWn$ZyuZHOuw+HNf zAfJPLW%}yO75&#i|Jk(f!rHufcrKB!#(>0wbTKjHCz*O5Slu84nC~gjhcSBu=ouhm z7=}5rv!oDb;@Z0M?j5){nRIlc@(C*I|-N z^S&7AfA=KIOZ+RhYu?0r&&t<7{pv!c4c@q;*V7wVUFvV>vPWaPGQMYYRUF={*1XR) z)Eg^UJW#|;=HKb{>uWanlH{m)+id#Yzp|_kzUr;{cS=`k(`@ir3&za9WP`V>XXhB0uyO%bWFF%NTqXt$AlmO#Kd@S;8s)*k^~+Vpx33 zr!$hbGn@7^?#3Y}zUwJ|yT1MazQf3l$?ew@pLwz=|DqN5>+!uv`0?C_4}ZvP;+=i3 zSK=GPN-pgs+Un0Sb)FbbRCi=RSqA|;^{ii-PolXf2)Z1 z_UQXF=QF#&c{3j0|Kz8BYSpw2`0ZfD)79P43mKp4sHb1vg5MCtUt3stfQS&e%n$!;U}i}zj%h>RPSzG zo5=PI&#V~UW{yq0H~zRa@_U6|5_3Ska?nSGs~6x8NuWb|^bFI6GzR zQ`Rt6R>WEK;F2+eN9@t#7R+$06T5N=Jv=>+j@dLP_9@GFcDoR9iz;pn`HB+}#f3d+ z8fMePlr-VhoVtT{q{CiF_o#v?II0VGp^59LNQiq>>{i#@O?+K-Ht8-m)>1t<0Uh$= z97J`|iA$B6m>z+6#C{bqJylFVHG7jxCUvFCVn?F726H1^({YljsH=$kN>!2RQE?`k mD*BhiR2A$>6H`*f-KC1Fql<}Yir~YP@IMoH-)F$TW&Q@`GRQ#y literal 0 HcmV?d00001 diff --git a/tests/rock.f6.translation b/tests/rock.f6.translation new file mode 100644 index 0000000000000000000000000000000000000000..e02a981a43dad362b6b5640d4f673047fe272617 GIT binary patch literal 4507 zcma)A2~1RH5MIG!v4TWVky>k%dVu00?6RvC6^~SEt))s0G2(&`SY38;ck!yX);mP4 zMN>fyMa61FEAguLeOIj-BUTWswe_f1i8vGwl0B}OV zJc`$y>q%Eqo$hqIGu7u#^`#Sp~jT=s0mfEn3}*K5yIyoLr4s2Pf(Ik-8_Tn}V> za-E7d)jeMEcpRe@!y7P@W%p*K`s`^=#SjQ#T5kGS#U}wH0A8QR;mQ<(-gJ*6#|NOn zPzS6Xm|CNI*RFbdkm_-bpOkIri(EMVbF1pXByJOp85Y%T1JEHbJYKN_x1NQsf+5B= zwgPLbnd_{HyFqMaSUmXsWSq$Gq0CQVKGq!taR!)EgL`B=QI6AKTmqI4wiXO?*TcA3 z`WS1EJur8W%^wH+T${(^N)7L!jGt?8%<+S3V+5o8Am)ciKa64F;773-^I{>6 z2kWQ7aV}9}L)cu3^t0sXlA{mCS<=T`JQizW#PS(d0DciziNv(i1T;Be<ch2b1GW%+Xic@TNBtA94$h&0tKuhYgK|~_iSU80$xY9*nDRsO zqgNHkT;vj79NOv}_C@)GKUuva=n~^oy|UkYyZ1A`Grn=yX%_6g!i77Z`*g{O0f=JyRBoNwX81n*MI3-!EG4dGOQ#7?^Uht`!&_da+VJi zbx-C#?f7_#4!$@tV9pkuz7MU)i|DC?Z;vjoNYKHj&l^7XnhxH$tU;cY^@%?_*we|H z2kToi{!iW8y!i`@2TbpA;Xcc&efDX;Je~gMFP+!#YsLeLsz0yOiY$CD(EcQr6t1eP zlfTcrvuGLPfve^(uq1bgVEy2$9p~bY91g&D4e6#l2)i1>;%>*n+Trs-^Q5;btl(@z z9emx$ap9X84z5~9@z3zRWV$II)C5)nN$GUaz0>=U*=_*~|Dh4=i0ap4FlJ>jmRp4rcj; zFP~Wvyi14gU;h1=GRCKRNmZVC_!~~wA$(l%z|kz9uJi15txNH@ig;fPdogV;i!)6R zLh=1i^VCm8T*6xXcF^L9ak~TOGd|UcJO9Zh{DvTYVOH_+<1C&&q1VPItS+r%b4Bl` z_`O1TTYi}2_a}>qH@rIKz$1pA+`hFUndwpA!$#z%%wasj_e=`TU7~|KUo{$VPzPT# zDsvV7ep6qhQxa16d72KsJwG`zTt_ErQsu3M45#%p3#e?8!SMEb+}pY_U3y%IhZXa0vCF9e+^)2mS z#_u(%6}&C`d=BGLeqi~|@z)uT@LrudoxpEf$|wBH1owCEF`Vi>t7>R$!tmsxfemNr z)cfp@M}zO^)GJzWWGa3`YwI1F>UDJ1;a{}n-No-ME&r||vZhjpe|Ezu#~2-cqh+;w zS28}Wr`hU7m+^a+^cUV<{B9J>C*GAY-#%@``fhQ%>c~;X0}1uMDxAGNq^%Bq@$x-K za~=HFlru9=vihXca+-HxD65Bm0=^A)0W?feCX-4391{(=S)H|XGlL%&ZG*ElHWtpd z7%L)HnzmFHtbU{ z|Lz17R2_@ig1xCL624%@T5yfA>gr-m$Ps=_9PWUa#TC)orLQ8AFS5j$smacHU3FK* z4*$ENz~w%OwWztWbG4$}0imfPa);IH!dET&w5qGHslCZrl__+@Zg2&`6jxd9r@Gq$ z5lo>Y&+5IwmF513J4f6PtT$OpbguTstIO-o?m*Fl=<^@SYF)(fKNEQ0C&9mE{sNLZ B&1L`q literal 0 HcmV?d00001 diff --git a/tests/rock.f7.translation b/tests/rock.f7.translation new file mode 100644 index 0000000000000000000000000000000000000000..e61d8ea508b2ce129470d482b9ff747948c417fc GIT binary patch literal 4507 zcma)A3rrMO6kSE@Vg-q!BBhon6$Hhd*&nMG712~`t))s0F(TjqE6XnIF8-?ct^W|U z7EKj26cMWtti)gagNlk)tr{a%6s$G%Q~b1OX{7hQou@aGG3g|C-o59Yd+vR2K06Tq zMf?bje6)k{9of3U_*u5wnq{3WO&#w{w!3V}ZmYvCQ#Bed@Xj>lSA}LRe)l!_KOAr1 z1b{gumm}AiDka$*smZn^wP%CkTl)F&9>z_ zA={a2lUzxT>5|iFohoUtp^Ri#Mv^-@#U^QdAWX?k&6M0SpasC?c3SP}9zj>C)0*uD zP@`!B)(4E$7&LI8+8!hc4*PVQW(0EKcSDkMA^@fN4q?_VO%Ktn2X0MMT}Sh!8UBR^z_kkoTLC__#w@eiD+cS}92&R`KW!P4T?8bKkG9Y5dV$0| zKcGO^xJk}MF2_p(g3e=KJfGuFi}w0nCVXD6@-O#+BZO~@?i_fQ#5}(|M%yq60;TTf zTF3XbM3?jHo>s2Jdr!%?9KLzAL2L-?P2Z=|`8+`F0$!mH3RcyXW|I5}ajs1b}fWq{b_FJEU?*+a;ab<-Y z+o|LqHts84OL*Y2{N<*E&~VZZzS?mvy6S{CzH7K{;-kQ8{v;Mp2KK?{gU@rlje(nL zJF4JYC+CFhBsjRNj^vf*enoT>KW*=e&!SRyZf5jv_{?&g=hqxL8RJXx+YgVAs30+4 z&y)w%I(*mj{0htF6Zj6}v2V(NP<-Zj%=MSAd)bKZMUJ0I>2Y!|i8=4mwy>ZR1Yh63 z>k~hs2UBdlV>gd!`cVaMEY+?qRl%hS?-zfQzPV21^$2Y-!6B9DUw-Hlrz3dA0QbEh zqRV;beXe$yLU>Q>PtWd4`sa1>TSLbI?e+S3{<0e-Wrqm=*3mU^yhpI_%iTYHt`Zx!c#JK<&C5)!BD z9tGh0pU?At>di4*@Y_L&$C(fKEF*kg$9&<-9rz8w`GpxJr%sW0-i)E!pOU(K9XsoX zJ;U!6p114QS#AF%G3QNeOg!2|@R~gp^$A3e_dQ`!LE>V<9iJW!&&I*F_^>p*T-6f6SeGfWzi$s^dFTQ66+uA-v5Hc;IikSx=l&XGNQxrmblD6@w-jA&aCk855*WX$j@8B9Zrgt3Be2e6_Y#*ExM(!J4f5Q-=+)ng3KKSm@qVEWw@7sv- zP$Pb?@mhYnvo2&49?$ow+c*6N;cx-a^*>Ex@2S))US2g9zoC`&j?Z;j`>XITS@Q4W_m+}>UlY-MTZLb{?TmGr3cu6Z zmO~o|pRcD|(aJ0MJ-5ZXtq36X@K3-Gz%GJ@E>fq{sh$PBNr{{EO5`oMZ`0K2sHX9a zn!uC|tP`UJap4V95Y32KL^un2w4DWxu!DWxz_TknGU;lqNfMAfABvO Lc;Cmvzh(XdDEP>@ literal 0 HcmV?d00001 diff --git a/tests/rock.f8.translation b/tests/rock.f8.translation new file mode 100644 index 0000000000000000000000000000000000000000..796ceb50513b5fae36c2499c517c539368697ae6 GIT binary patch literal 4507 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 N|4iU>9|QlE`4@CB#uESl literal 0 HcmV?d00001 diff --git a/tests/rock.flatness.translation b/tests/rock.flatness.translation new file mode 100644 index 0000000000000000000000000000000000000000..c715aae634ce9a9c137ba5d0cd425fc7385f85bf GIT binary patch literal 4873 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 A&j0`b literal 0 HcmV?d00001 diff --git a/tests/rock.label.translation b/tests/rock.label.translation new file mode 100644 index 0000000000000000000000000000000000000000..8c3901e25431347861b81140292b85c5715a2444 GIT binary patch literal 4462 zcmb_g3s6*L6uv^}LV}EDD2Sq=h!85G1sNGCGE~5V7j|XYh1~@e6MUeEI^-*~ zLC_%t937E?(S%HV;QK|XV`8oXnT=rzHfYR1=U@I~r#qJ!r{T_=J?DJ?cOL)w@4dUT zVe`Xg3H*8kbYCumL4T5LR41v^#l;KsO07YoG^%x4P89@8us-|X-h+(LZHr%luVGjN z#}Py?8g!}pI5AqIi&JW%jk;(VOWrAoB`hjDP5QQONCTmjl z5Uo$uh=yognyA;S7mLE1u%c2LRMAFdtVR@U!HrFgOB9V9Pyk>s>ebqW?u3Roy*k+l zpdj=C83|&pF>S&Gxfw(&y?xTO!YsyxtH)7U!6F+I(`>F9Wvr+%doJLe1YuVfxfqMM zUH0I!Z90RzD_I*S@h5>lm0$s22XQ}y;0uTyNo-a(2K;ysjRe`gaJCl0v3X=IlG`e-wOkuPui-X}W!Gkj&#*j#?FPFDq>N*S$XXS#SzI;v zwICNk?((%puG#t{u%B@MIcN)u?zt#H+krTOjNlmKyK>tdv^U5!vNi+kImDj}b{I$m z!B~zc?yErSL6%9@Gr-RR=?iD)0}~^}yKJ&`0_wS zV>~$0dY>wE-`117$Zu$^+BAyuY2Uub@7`o*F3rI^W(>GMeyzo96OXEBLGrCUY|VuA6{}e#i3_K?ySbZ`hh0 zRLXg5HaM^Bu{%{ZBtE39Ais_HV4C|lKKW?Tb`pj7XO z9@*k_YdHAqi-yUhI;WBB8IsO3-)Z;d7r?{wW4V~@i%M}_MfljiXc=#0Ⓢl@?$GI z55mLvm5BkrzC&<~KmS8r;1D2TpH?%&JPwk4xSyEEXS{Nt5A64_@19fXoX2{#i}iGy zER#QH$IGS#z{CAqh#gv2LGoiC^`&E+YY4t`+@NQj#0S$nhtNH9pROZy5N|3`Y*`_L zi-)aWbV4ld5BcM7dnnj<6YdB5`0)?h5I@3Kc^V(GcOuRgc~@+24m1#6tLa?27bM4h zVx8PBH})93I(LlUaHqKJ2#_%Ey%Srv&F6Jk4vfFEJEb#<)Iog5YLh*CKVtugTQ>Z( zqz3qiW4*9OeRd|nT~msKgGfA{^V)qQ%9D9ttdFl3zRbuWeu7tvqce%ax+b5%z3exF zbj~3@$82K>AM5yBU34Ie^i!ZJK6{bGXD*$-znRx%d%=AiG|gxe3GdJ^%Pp*Aco9vJ zC)x?`eC1(N4Dh7qv+(o0$nC(xdEtJlm)oZn$l#i;{&VVN@I5gJ`MJCgdVXaN1=|y4 z@XEY!4^Pq`)*Zk6{)1g4Kkj?5_5FeA1Rq_ktMG>)+z-Al-KVyf2a>$QW)Eq~B=rx3 zuZhnh{(FxrzWbf~YzAPOdRp|d>1mEVB^{T5H#LD9sB)K29o;*>+kZPSf0xB(K-7ypD0Wre4N{?a<|DJ0w3pO zUy*b*l<+XGZNt&DYdkOQfBM+5=W==PwBDtqx@(I_zgX{iqm9B5aNJvXQLxPyGWFK| z{WSDv(iiqolyiDzkxadlD-G%?GW>eq+(%wA`5y@$?KfohbGh__I#`C^e_O}*yEvci z6Da2UU~u848|*hM&TnJ$=J$t^c;ww&QqyKn_C2(@@$?SDgB0d`1#2rEY-RBJ8;{kN z9H;Yt@a3h|wKDq{mSNcF0y(iScHg`WQV2OxwTW8YQf-eq-oM7bQ*h2HSsT&IDksFc zQ|QHy*XU8Ni%S&DAO9uygyV3`>)n(1f1kax&41f`4XeA+9*MHcz0+ndX6b%6u;(ER H{%QFKvWHs` literal 0 HcmV?d00001 diff --git a/tests/rock.lowRatio.translation b/tests/rock.lowRatio.translation new file mode 100644 index 0000000000000000000000000000000000000000..c5ba867850de409210f1e1fea034fd0c7a874159 GIT binary patch literal 4873 zcma)A4RBP|6<(5p37U|BAR(gC8s#St?tS;Yd*1^al)ot{qNWmQ><~g&l9f$1+1-G| z0xD<#DI-=xD}PRm5C_JPAuS~>B7Xt}6bL6#k@eV!(U82WKCT2EzGpbv#rVsteA2ELvI>3zx=2kt)wL5J;8=Ek{f1 zp1Azeo8Wg~Qo$w*C>o4KYNKVrl5nJ~G+Yvol*Gz{Rlz_y)>V~O1_RQgG8l`MmIq^j zTR>1A!NBdnR)=e&;2o_E2V*6X1;J=EG&dNy6*Lv4v5Jy->6~ydkOtzM+OqkoY$6<4 zSSW|6fS~~F1Cq}T^vDZ9;*AWDWv4@cevqIWl^`1++X%}Cev&5_Ap9}J7b9NgoelCl zpl|{n_2j3#a|xU;0W|=<4kUfIz`5PyrJVS*gYI3Ve-HQ*p8PSw6aBD!Cc*A&PrjCb zOP?gTp%ftPpN{xUkIzO}4)A$MmVPG4`9PBraH%Wsut$)t*yAg_v&uW;a6aep(pNsK z6J&`sAZ!EhjX=#F_BPVBAzu2mgZwVgAAvsebe-NQ_2+^A+LN!snUv(tB?ZoOpe&%f zJWSf>c>G8>O`x$z_WwQfZrfl`)4)K^?&nxrLD%BvWC3>3lvx5mpA=3 zeH;inuFlu?kNEC8;geD0;rxEtW00)kGs2qUm$;tzi?&vx9vXo>fF@jy?x^B zTeoJU{LIkv&~bLs(;a0#_|p2BFUWT%(Y{~XEo)99Tz>h;SVy`qZW)c@d^L9H9VN(a z%F=NsI?;T3u0B2Klu!LD*49s2itO~f>PM`rScc*iG;dtr$H#w- zSMfu=(?dS~i|6P6^>Ku2|0C}ln(!*BtM`M2xhqgSa8dotzHpGVp+0vwoA>7-yYxAu zhdu2Rf8{IJyS_p3kIor%Xf5*7b$qmS_>eaczHZcjZ?jN52%+kjzIocEThSae-nAv= zrRzTS!5yjBYEXV{pZ7^_$`#a)uH#RCPb>Hl!Yf9{zZ{9;YP~*-bm`zv9!T=GRcaU+i7`ax2QC>-=;>&3|faiUzAjb{IuQ7 zuHwD&J6GEs*}0>m7mBCroAI-TV)?s6+iARgQAX`2K6v=XZBvG#xY~a6?DF;UJ1;R# zbLPfh4)DQuHWcM@pZIx;&Yb-a;kuuJsb~8C8sYb~M_P}eI`rq|NV~h`QDirG^6gy$ z<=|e2BEwfuY6|LtRf%$-cgg2-$C*9 z{fCYhMsyAGEblwI`yu4t^VYbU`_bO$Jiof1w%m*2X?)zdy_>#5_F$s+Wn#-P>vI%0 zqqXvbW@M-R(@yVNaM&mA_z@!x@9~+#v4xQjK{%<{@U);lfS>xAJskRT<3xNd_JExF58*OkpIm-PF@Io-v>YY z^JC9$M|ElY!AoMRa!@|`hv3~nHsmCEL_PnHv24eXHl`zNTQat=grg9HaH<$em<0?R zw#g-88GlAt=u6gA<~Q5maV#=&^vc~H-)QWHs#XYpr&J~IXhGcRkILq zJ<6SW*W^GX)u2tdsZ<6t9mNRSAS$~7jA{@DZ>j8n2zT;=G09K{H?J5Nl)Ebw-d$K~ZD8S{57ifp!|k2B VGo-{e;N6k`2a=yJh44?X{{qPc7$^V$ literal 0 HcmV?d00001 diff --git a/tests/rock.regularity.translation b/tests/rock.regularity.translation new file mode 100644 index 0000000000000000000000000000000000000000..00c7d18cc7fdd5d720ee872c6cb9eafb06a4f502 GIT binary patch literal 4515 zcmb7I2}~4c6kfpts31{Pq}CFpqJlUxyDY3)tazkSYb{l3h>^j_7q2Rw6|WGr z7EL)c6cMWtsKkSM;C)-QYK&Mxpw`r*ineHJr0@MZzkQjEq@Co=|K9h$cl`f9Gy6mI zXVIf{%GDmmj*4`L@so6iIn_L0o<7NzkY=|eILy{Gg{srJf>v^S$+qgD*8^UI|3PsF zjxUH!wp%l8NphUUnv`IPb6Df-NphO3^P;}Agj89F5vj7>o{%itb)CRq5wflasOgqW z8${bOEwVk%I$O5c%+qDvTi{7au&2a15)v)4&J)bU%%oYeLjl|Xusdw#v}9*Ody>tZ z?f_7yYX{N~gw+^2WQf)p#7U{ML+9#7As4PUE>#C`;xgfgE!pJcOiO~z?3l+Oe}ImH z;MGbl+yY{@dV`H~?G4gbDcivWGJVn-2t647Icj&&h*$RTOB{1$%bhOo175J)&{}kw#75fIk)p69WQ}G@v_6rq`F)px2ZXi6~i|9Uz z?nkfy&_jrgaR#s>Kt`)@^hGJyMBs$p9S`EkdCl-{vfMCht`3kv2X8-*cXrIcvInCud9U5>s9{YIB=NoEfHP(&Jml( zmqohOPX$Ar_ft3Pw--oW&aY{zT!YV^nr}LE`+Bhk-cm7O>m&M*N}BeMK7x4^$Sv$`}(ki1dS>c=SaaKjx0#8lE@yk>3p;VoN9e z`r-S*{XAcuU;YIT4Sd_QjDTGP2bI;4U1vC6k-V`Vckse@QJr_;tcYLmo#i->KXdqG zq!)?rFfux*oY;Im@efW2_^s#h<)$si@EgW$uf)ND_|9{i=U=t)WdnW}Ies>==gGaq z=DaK02lPHh@J+$po_dpf;9~Qgux0#{?=|p-61R0F8n|5U{^C#4H_sDtGsvxo;1J64 zUw!BqB@jGiu;X5Dl9%%?dS34uPk2qWr|0)4{qs6Gt$`DP_Imz2e&wy=(u0J5=g9gE zvq>Eue=9%Z)dUjH@r_Grz4vSIU2A@tSxNZ3UUa=J8-K(3J_KYGkDE^7`93e()~5`A zt2poL$uF~35Ib3Td6D=S^vdJ@SO$XZDoW#*lox@5xhhW0w;i$E)Uf zXRg!0Ev=o$R%_r};*<06_nY^{^OX7&e3hty@5zk`!lSa9A2P4*?rMVb`E+-$>pFwr z{j01M63NTImxIEa%Z!BAYfO)Z`GmJKX6cN@#MVEk*#CmqptASiM7!c%r6do>TcT$D zj^{RY->HlDO>5M^-wPh&dX41g`)|GwZRI&|O!gSue22uh>=>3YfIK(6{^sFgSsKa5 z@nMZe3cn$IzHXz+0z>h<#%p<3q+UuVJRa{^vv2k-!sGaefdfzD*_Ow1{QMm2j~^18 z*Lz;?;ntPlF-7A%mTJ`d@~KWm<;!SB4G<=|$*=kw`axaJz3XLs z>e;MKSWA+ecw2cy){kUhs}zPabw)`N_8^Fex4qhJdkq4coe}#H!*Ctm#21aMTec>W zbFG}~Y-0U0L~!m1TNBa1va$UVoO3s^on?IIjvEA4*U08#Xlotb)YbpSrGNLm?O6US QNjm%w1wQxD@b8&_00>;mUH||9 literal 0 HcmV?d00001 diff --git a/tests/rock.s.translation b/tests/rock.s.translation new file mode 100644 index 0000000000000000000000000000000000000000..b40748190a2da93a4700fd7dcb18ee4c70dd98df GIT binary patch literal 4506 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 Y_NU{P{SV;k<1M4_J$ffg@PA7G247CvssI20 literal 0 HcmV?d00001 diff --git a/tests/rock2.centroid.translation b/tests/rock2.centroid.translation new file mode 100644 index 0000000000000000000000000000000000000000..33f3d4ecd02715da24ca24626123a1f440dad38d GIT binary patch literal 4829 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 E7uwsj=l}o! literal 0 HcmV?d00001 diff --git a/tests/rock2.f1.translation b/tests/rock2.f1.translation new file mode 100644 index 0000000000000000000000000000000000000000..e84fdda003f2382007243b4056ef56736016d6f9 GIT binary patch literal 4535 zcmd5=dr(wm6u%}QkQmblI*cNkVL{5?ySuz})WIwyK}Ezz%JN!pWgob^7$U=oEYMr6hIGC3Dy+;+vCY-lQ&Nq3$qU@noU|;xodWIv*z8t=In$ZYmS#0% z+X0lM9w2XkkQ$L8A)*=R3>g_I3#D<$h2w>za)m`46Vn+oF#`ZP3exq01C}IDy55&+ zKhOcx4g#$L2?ZGo@`5x3j-l(5K_^msHq{wa8>wb_tl;NUYzenk0`_W<^%UC(x{}&^ zL03~7^VETTg!;!ppQiSC(APlPsE^#6V0VH%qS!NT%>`zR98aqIQ;irN{?s1|ItWBX z{ZOh$fsUd!@}sF8M|A?|Ss=;O&!8H)MrvC@=YkY~lu!)U%Q$-j*cBkVLH1I-n(8{L zF@_ySD0UL`S&&O0*C@s~sM{!Zv)fuH_>a0_EbbZLF0a5n1mX>XxG&WMs77oEXTL@5 z5un34JPPb+&c`@B;s8sgxLL67WIaFUQ_d2OTM9NlZUR8cz=l5wT9@W)Cz^1UxQ5c! zo_lyT<)Y7cjazHH@qS{w==jXCQZ5d2p;#i{K3~A`7~aD-qY!7s;#uCUOtcJZ2UgyUay?YOmGz+2um3}0vd-RIe+rTSL{ zeO9L zNv)=3PXzepZm6!bZ%s5ZG>kiXwf(}`>W z-|BJkwPcRZ<}#=2?vxu`KjWu{mUW3m^@%UcGdS?9^rRFO;I3B}W z?3RXTu0H;3!?osl-`(%c;aS@c=ecw7zOhS^3pxK%ezVuNTwV5DO^){cJ&)t{dlK}Z zh4a^3>=`>&5Z4%$<-qrTwvXdOD*L5!ar^vp-GAnMFiGEj=ca#c<>J_!4qlHrTE+1< z6dmY`@2o68i?6R6+}fAp;ZMXtASZ#V8lh6D{#R#3k)a<&iNLcul-S{TR%ywZ*jmDo zHGs$wh`j7B6fN#r(O?F(f>qRNHJ&x(tYA*Hns6c%u$53^hZ8%T^bm$jC6w5q#MU}v zk)u{fW);b!gdsxatd^ZN*&XRz2_rcp2og^6Xvj`Ok*PQ{lYSJk>zCcBlP{B9$Pw6; zqIy1IISf0L!^xc0h|3XJT_#`o?i z)ns?{Dw9~5RCiuem2=mGN#?0&NzXEwGr3ZVOzJ9RR%EIQtV)tQ2;TGY@GqNx02O4m A;s5{u literal 0 HcmV?d00001 diff --git a/tests/rock2.f10.translation b/tests/rock2.f10.translation new file mode 100644 index 0000000000000000000000000000000000000000..2a75ecc1cefe7ac5d8ec285c3f18a0bb6be22589 GIT binary patch literal 4536 zcmc&&YfMx}6uv4TP_d*DG(-`t#TF{;WcWNvMg}Hm3`pd#Uc`e0*Xql zq9sO@;-hM9t5^v%RD85P8kPE}4+JZZQqhejil$nt(sM2|I^B#3KTLYVnRCuJ-#KUI zFgtreGhH)5AddrRCn6r8r(|07MtzQy8ZYZi7K6^JH=77m5c+_Xed6N!hO({RFTfrc zF2ETCB1;x?mYgDK4dxV`L2ET@Eh&;o68f`qCY@0dFv2KVEV^{bBJ>4EiI4n1Eb(UfC)~n8Y@r#@?ohD#i8z`xr>qD;}5?Z zqP;--5Ze#53M33Gw2Fp z?*m;$Y|K*&_EF-W1bvp+7eQYKX(K*zZ-Lzj@|a-HnK=h&GICsr9z--^_;?e41ZY1H z74gG}9s^oUY~)81JC5jh&~reNh@VC@at*|mL1%+31t}sJ&X+LuCa}vv_JHgocoosL zL}LtnjuPxN=<^^~K&}&va!|Js?3UeJC-{%;FdFw9aEIP-hCtjw5cec{Fwuw&XY6;0 z9RNCl!PQ_#Gd{-Q69-rl!A+d`Zq~~&mvELd++witzVQJm0ULeXj{fU~dC_TMt`vqbB!ESy!? z!1%PzvYgTNcbI$>pET`B6y6Oqp5mcpw+(m>C{EWk>#CfGcL2qg%q!b~=ZE?<-j+RX zFP=Ml+{@1;A3y&Tr+H_bjt$W;dDa|QziJWV)4U`1`r7b((0GcUdvtdfez(};Ppd4! z-*Wh&GoHB5;^1FocsC|;@Vka@%0FQCgLgI7zO-tsdMbmDS?by{m+|+9-5ngl$rnD> zXNZln-iHl-K@}W+p!V;A6--{Njbe#$?DrvuUnA{2ev*?v_bZqCe=#_Oc7KkZ?eN^g z;B`%NYVR>Vtry}S*nWe9-_-x!q-JoMcj98pO8g3^zn8|34xj1I*~jdzpPhc;;HJ*D zv&T96E1Fq;2JbAIm#(igxiqnWsYicLSMMAbvl-m2z+!x#sdww0iCvc%pXRfP_D@SMHy=jkc9aXaxzZ>jveR_3GDuG}kO{djf# zjoTgZs~H|plsdbwxwqr@BJC5c-{EB5j_)ZHudMA`62Zwks$!uK$M9(0$06$SIUGE( z)wtp*2Vb}(c)y9sPuJm_SUhSB!+&F}_C3=N%KvQrzWWJGe!9M^dH)>1_Z`}&v<_?KVNSeO+@iKJJev2DNylwglm+ODTy;CmTeGhMGiXl~fa@F?D5 zHP=To_3>{DoNHe2l>{M2 z6mbkv?4WL&LB#NvvntH53JSrI>@=9Md$#wNv9E*wdVAQNO%)Ikj@=U@aqnVSgkob) zL=pE+#_kS8Dn0qnsB|w<*Q#KPssnm6qTKZh;W{rLGa9L;D0v%0yOfq Ar~m)} literal 0 HcmV?d00001 diff --git a/tests/rock2.f2.translation b/tests/rock2.f2.translation new file mode 100644 index 0000000000000000000000000000000000000000..0753253b9ffbb9147052e73a56ac19a676a07666 GIT binary patch literal 4535 zcmeHLYfMyE5WXrPP_d*DG(-_wi!D?^9@e5kv(^@=pd#X<%JRD4%06&+v53T=fTB{X zXo>MbQLI|q3RVIQ6(6nDM#Wcsf|W<9=tdJoQ>|6$44$!*%`xfUCf+dn&3xyZnRCzH zd+uFgrpAm@#NhzwB+LVFQifG$&}FMBvF1dhMW1NZnT$fJC_TVCck1-C;PQ&_=j4BI zTtL$g%&b~WndW3wt2ZSl>a|vr){?9mRi!r{GbS2T1v3n)#gdq&T9lp;bY-ZDC%75< zOfzJgGxe%PYg(Y1&AJp-c?Cx1CR*ldt%*r`RdItbDKj};wF<%+2#eLMGp0Q&Xh}Bf zGOR!= z5$FZzBYZ!=K(G;DW5Hffri+dgjXA&?qsCQWKY_^M;Vt69fPP?s zA|4@dG@wTKsE-hSw7^)vSzrkwP8En+z3|O|SzwF73I&Jb#mwITeks^4uswpW5?Ct` zbLcoExZ{9lz%GJa6&z_0TLpK+Zma|1hjtw0Jq6yOJ6uCx?qJA!3hXZsx!0NhmhguG zj%2(B{0J6f9v;!aB?#Uq8Gokw_cKRmmNIP-__*EpfE9xee+o=pnIAgQfNP0kXsvBo z2UiO%#-wZ5TJ4V46X_yi(u#{%9@auLg}r@lG1C#>%`-I@*NXC~?$$=PF?fFwAMO9y z+1*S>`B7JbOE)te@$>Fht@L7gs+-i?qo$hiO_qzgd6M%gY5O$;?2mi^#zX3}`{+rz=Pt(AHO{KN z!(!?e;vdjw|tA?9oFy0o8vprvzY4H+?qX7SswA_w~92l z|JnCH)3LV>_gZ`Yy~fi2U+J^5b#8=k#EFLMTJG5-R63ui}_hE>pbe4pVZ!s);EaB%b z3a&7+`ZN#U_@besnf}QEQ&kYtQNM1h2K4fg@CQrc{0Fmq(ywcBb$U(0M@^5keaF^= z^q;QXb2pCFr}wp%L?Nbb2zB>%ZG9-Gl%Y|1Hn4Z>U zPUoE|*V%l=PyH%mBFiV;J=?J*zD!r|@ktE6m(iSQzIvtU@^+>pzS(N3k6``rXB&<+ z&HLeAFUF^rAIx@U`JPcr6LML6F{jDxd)Als)r1JoKeCyw?_+{E0Xa>^NuxhXn=(zWjW-0{{CJP!wlzzr?`5Z2kcgDYM-G literal 0 HcmV?d00001 diff --git a/tests/rock2.f3.translation b/tests/rock2.f3.translation new file mode 100644 index 0000000000000000000000000000000000000000..405d52970606658dcfb98668474e74a3eb74edc6 GIT binary patch literal 4535 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 literal 0 HcmV?d00001 diff --git a/tests/rock2.f6.translation b/tests/rock2.f6.translation new file mode 100644 index 0000000000000000000000000000000000000000..6e67196b1f6dbc9e703b3818a4b75537f5cfe3d9 GIT binary patch literal 4535 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 literal 0 HcmV?d00001 diff --git a/tests/rock2.f8.translation b/tests/rock2.f8.translation new file mode 100644 index 0000000000000000000000000000000000000000..12a45f9cfb4349b1821b29b5ef7da2df097bb910 GIT binary patch literal 4535 zcmcIodr*{B6#rB}ATXv8bQnc6!-AB3^3qXTvycQ85g#ebYr&Oe7k3v!WE>P!RPuqw zI6ep;saYu|0}Y9fGHq1ykxwvrM4~%7qv)iWO6M&1+Ht)!{?j*{@0|0yzw@~FyLM#j^>_}xg5d_7 zz943u#guJM(P<5)lq7@JYSLO#bVi-ji;fwSGIbJ0Wa=!Iq;#D{>IsfLLMQovnPtc} zL$o>DptERA^K@pjK2;~Z1|zeREVH%Nq-29m@&q?IJ0(MBWq>OH7OPorOz%u+NiplQ ztN=<@^~SgGFngO;V(%D5WvTg{#Y@a)v=%Ca%-M?500JM?pHexL`_E^mkPwj3AYG)f!%=K}BItN#&ty7{X#>+dj~V!myK|&w^Y6xyCTgLEXZzn+{{`;6HM}c-%9jx$52{Y za}KX!T=Y4weruH%?kCQRj7={oCUKYx#T4<*`GthX@oqk8`M6d*p6A`#;5iCEUmTAK zT77O0;qmzBtID#?gvaqY_bONT5sysv4O&G~o+aD2h6P3v&~aG%H9az^dJ zedmb#2D%mC=bz&|@063#s#ua|<^HwH=MkUh9kM6DhWmrZbNtN1J3IYIUXDMhv?#w8 z@YPcudrcGIpJn*fCkXI6hOf%rC-cFh8f#owzDhHZ;3F2gH_asezK}cpRDyh=BmMi^ z1pPj^5~wH_@PoB~6)q)tu{Me&%Gu)s0l!+eBlJo8Yw# zGivS{CU-Xc<59w!91pS{OIzt05`U`oIWO) zU(wXEQ+Q_ayu82CJ z7i;kRbF6>1eSa;UwT^gr#qexAHy!aUL#wyocY`CYPp_&@74S2voCoX_;Ai|~>wXaA z@o66YAWqQ#blXQ>c)mK;UHbWuppk++1-2@uA_4!W#_IX?0{)u7T?Y;daBG%w{Wd{A zOE$YDt`Xpc<+YnOlDc5p_v=6>&v8cx|Dto-t@Q%lvW_A6I`e#ph3UT4=;uU7nC3|MZZlQbBmUUbmI~J^Tgu;nMh^!6csZ*EPDkydl7&r$*Vn zCF{ZYpRV0|FP`M*{aw!gdq2MK@O4USvsN4u#B1f7HCDpoc|RU^G_O?9N5zDG<+BBR zUv+!{zVq^WJWpW!!{4I>{LIs_CeB68`E{uyn+RKmG?;|ar^voTz?@xnD)MX&rSWtOyc-D9lRcOw1V(A6ddS{@2osO zkFTv6*xZ}&@F(H`kdwfb4U@@auXqntcfnMJV+Mu&PO`~mYQPmr#O0w1=`ol*t|Yf1x*pokKd8hu~_+LolbJGk=)9F5z@$ zkcVLvMdxaSBS#q?2KN{8zZ6AB<#N*be==zlv+bSBL+$I(MXW;QI6D?=pO;Me(sNhh zddigc6_(*#a=IMeYfz=$rJg{r=w6PU_ZNp;GU0#f7$#4@UpYV literal 0 HcmV?d00001 diff --git a/tests/rock2.f9.translation b/tests/rock2.f9.translation new file mode 100644 index 0000000000000000000000000000000000000000..f4f1e55ece2e4c83a48049ee83ae20410f6a1a03 GIT binary patch literal 4535 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 A_W%F@ literal 0 HcmV?d00001 diff --git a/tests/rock2.fourfloor.translation b/tests/rock2.fourfloor.translation new file mode 100644 index 0000000000000000000000000000000000000000..64a8f8ee760490c55b4cf08b606d0761ea6c84e7 GIT binary patch literal 4542 zcmd5=YfKbZ6dn~2s94en8ls5SVudO@vn(%-8mui+K}EzzmG=S*yDaQ37L^zjP*iFa zEipbQKC0HXij_b^1+=x=sMJS&f|W;6bfc-Fsn)9WoV)kx4Y?-uUniV7=Y01&k9%fz zc9y7_QIjNk*nxJS;s$zJmPKdKE!HMSn-Vh3`UH#4m`SOU)Ca7F+WJvtf8L0B0saTW z2{?m5Oj@%s$CRXv(;Jf#^l=troHa~&!xQRJQ8CnYk904#}OuEceTS9Y^ zNta~-P?CCqybVHXg!uW1W)PQ_osn*qCLtG&SB}aa7I93dok3Dy!zp^B(L@k0K#qcR zzv6%;5{1hHD9;157qxvrt3U!kCW5>o4S~by`gG8EwGf<7bqdvbs#zWr_<0mt&aD-L zy%uC6#WsVkp!R;yRn*2jwO}8i{&CQ!seK;wHIR1dBli~AT_BGs_MBU@gHa>Lnd(7Q zBZh}3^+$mA0Z~yufa-CeL#d7YFlt9q9SwRONIdmZs79`y+9uGsAWK1tDTeE%oV^L` za*(|s`zc;UbuHBx!;T{qI|=$M$R&_#6k{CJ?G(G!W33DP$2~9>_Z)D$-f$0rxPl<= zPW51_5gX3g?^1gV=pYUc1v`xMF%FMNz~U*MDOk6$UY_$PXF10$0UMt>ULd7l!=D7L zOWB&K2An0Xp|p48Hms#w^ck;dd$lXxPmC89m0DWD#bGWKW5}rUOF16Hd%36NCE^;Z_nDZ0Y>tj@Bq`4~QB#*+|yHn4bxYqs3h<9)zz*4LcNrhI$`Fnq~^ zEgSIuVLpqu=1$m$_gzoi!^f!rKmQD8d1sxB@Q>p1tU0)T)k4l^c}MQ^w&MN4;u(JC z(cRsiTwaDhtum{>5%4v$p195t;GbuBHpL3?yZW!o-{Asi4>ze1)-s5~$&)?Ut#r=aEVhuV$F9@mJICZ)4tFUu8{XsU-Fjzo z_XW;p`K&IjZYf+G!*|{(3B~7M&-!P(4%XqbwkIB3IW`BMn?3PuqieR|cSBEHms(wu zEZ}EU+Yj9>z|VN9HvA~a+d@%h@b?usu)`i>XmDX>=C6$|)3x6~|Z z67bjg>^XE;fLpTE8+Qo$Dcb53zfOP`R@80T%+&>x+^@szT&5i1_!sRvZ*LUvR(6lX z*O?dlJlkBP?Jel*`t8o>)f^8fq|TnJt{wQj$mYcAcRCn%;Cl+gD{K3f1_|@m zIUdXV*gv#R>E|WD8_HsQ zM{x0szoEt1;Vl6kF+1G)9XAig|8)KS`!QU8*5Bp)e-7gN4x3X-r=_x95FaOR4YhDQ zmiOZ+NAt=AeN;{xT#+W=duU?3@tv2|V|jdH9{mw6;2Tay85tKf<2NRcZwnFhIjx{3 zzC)0I;BLc-ECJu-bn(r2j?d<@p!?p8n_NGWXMUA6m5XP*2i6nIyg6Q@+b2=@UdDQ6 z{pzKbE4w%z!&@!J#xSlv{(8f;mh>MU^yBc1oehf}xp?=8n`?*m?(&A3eB+Mdq3O9@!=H%6S=qpp1F>{az2=(Z;x}czcq1j zY)*%-haauv_?rq24ZwF+mY>Df)edVL!13^x;!u#2z*UV=sZ{@~v!ck*kD>(QSsg&^ zAUvxyy30A;X0*D<%>>$!Z zATpHzVh0dgV~a(OS|OQLB##n^2${25w%KHNq;n;Z`$qmW&{ z?oMrdne0Li#;z3A%L&VY*r6Om=B!3s4#w&->584PHycwS{nI=O>0Bn0QAm_+7bK5D zu8u;cs>oz_GO4R3yQ5c`#LA?)?V74=yCzIBPens|mdTvSl~QC literal 0 HcmV?d00001 diff --git a/tests/rock2.highRatio.translation b/tests/rock2.highRatio.translation new file mode 100644 index 0000000000000000000000000000000000000000..60592a92ba7604f180f32f8b9b2246896aff84c3 GIT binary patch literal 4898 zcmbVQ3viUx6<#!n1`TE^1cm|ztDs>p|9$)~V1$V>4YYw0Fep~?Vo8>4vdQj-B4j8M z5UglS{4olGGJL&UtSfAO8^s& z#iOB`iX>sIJQ}Kv0~iPl0QnJ!IAcO?uBivb6n`9xVNagU*(A4rmL+0ht1F9U1{om-{~hT_o+FOTAF)u+)kt z3hM@mtv}Z^?2lPCU61iR|HTs679RJF(fMm_II>?6sUnuGzZ)>&w?* zD(*YLQ*MAe1d<7Yc$U;7q(W5c9sIApGPb{6-)vNI-eA=vUC(JVB zWp6$k9&I@9;Um!%uWA0v9^1SrP4iQ{i6xWY{-@!*;W_Dzsak&EB6|GLM+JPD#`E-! z4NvXR){1xR+hYO+=iV5v<)!?uw8hvB@R6nZt8n|FZ!=dJc%H8sb^I9velGk@ z^A}p);3D$=^r>g_@ZD1Ula>!Wh3}GDZ+Fg(m|@^^@6R4tti`FkE*;IGUm5&!i@#Yl zP2*MmvFWL|h7A7g!QXyxuYtee_4M;~8m{_ZcXdnF6|H}rC+2ljYJTcGJ}&okfdT&_ z^!bT$Ene|XeLS}2E)75a<6ZlnH^e{E|9;x<4E5Dq=-ofYFu%2PoA=#jsJp4GX+D02 zsQ!bCnA4FjKOp#-qwtJXvFg8Qd7Qa>YX2_7`H75ELw=*hsXlD^a$Vk3!}$j`d8j@c(Of`{R2J=dRD$`tFMcJYLJ5yJ*N~^-Jj`M-BL@md?$6 z+POd}<~cegV_LSB=b_ZTvnLIHYx>9H*O~9N|P1Z_WYDPvKjSWu6{p z;O$F`yhb&i){dJteyXii{P>o-K)r$YGS6#XW5DP4R6n`Yz*D!3ZNFRVr|QF)`Rm5d z(|E4#inQ%B#1D9Sfrc;ai?@z6#21s7^6>k_wRt=`ZBIjwA&=IXBUT04gNVrU;q7I zhWe}b7e*8ZYE^&Ng8O^sYI9fk%*OVTA_LFRH>&r(Y4DGxAG&S5mJg&X&Umc&5xqi~e-+ z2O3_rW%tr`+BsPTD@&$me1{vlGX`sOgA@c$Nq*KpT+MIjm7Gflwe|W#Hx`s=`Kq|% zc~yy_+Ib(|*)sHYEpGd$B{%;;TdR78e?0g1?`V00i^${8C#UaOtNFjs`0ik)ovY$I zJ4W~5cW>1X{GZ|-Ah}SRb)O}k|Jz_L;g%2K+_QaxhU2)5GBBvee8sK*JlI`i?|ks6VGFo1qLv48@IT_T^kW*x!gq_#(ZjV+#;^)Q7~+e zIUX|Gj>CN1vOSx*XgJ)XR3MIRIl>?|<#-n4NhpTHPsdIgjQYq!EGwBaaU4Pg;&V%! z1&P`O(;%+xajc!VgjrY)gPEm iFal3ZhZ87S428mV5f{?&VVZ#e{(%U8uN1;x$NmF|kOy`E literal 0 HcmV?d00001 diff --git a/tests/rock2.label.translation b/tests/rock2.label.translation new file mode 100644 index 0000000000000000000000000000000000000000..06ae0c26c31842310c409fd447e33af5b3ce3ea2 GIT binary patch literal 4550 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 GIQAdtS_ZBF literal 0 HcmV?d00001 diff --git a/tests/rock2.regularity.translation b/tests/rock2.regularity.translation new file mode 100644 index 0000000000000000000000000000000000000000..04c026899020fce99b211dfd3d72fbdc3991b919 GIT binary patch literal 4543 zcmcIoc~F&A6#rB}ATg#9bQnb}!-ABzvFfOUSx5qkh)c@;flnShe2XD64hkqLnW8a{ zBHN6QtlKOzP_1vS%As%H>&%jqOoPaY3 z#2_2>W<#f%lMcw@4hDNFt7SY~2|EMY{3Y&0gO$wsL!IMxVRatAX@XEs2z z!K{;w@%n|b!Jti%rPp9&UZQbcyeTnBCrd8iCYh7dWfKD&0Wg{j+RU`>gvMlpHp>K{ zB=rJ$3&dI@#LrK(2JvaxX0u6}fLyqGTq=7Q#AQN_Eg9rAvo6t~H7&A2UH}~d>FVKv zA<3DI4`A8@v=_5|Kr283K*odgkj4s!v+*gQW0^gN=~Sk5O!GVj@N*fqjEoh5y#{0h z!#07gVD=u+)y&2`bzmQ6{xQ&}n0*fPRggC3BliZ_ogfbx_LPj-!CE87ndw1HBZikJ z^M`}>0Z}kNfax)yLz#{IFlI+G9RqqcNCNXynMSUT*#^+rAWJ}s7>45|#NG&YImj-M zJq)jAx{hg#;n!h?odA6X8S4c9p$*34o&s*y8}<;0D+uE5Ob=!n zu{VkR4zovr4kCCc*kQ!SIJ_bOOJI1WV7#04-#wRcmJx0-*m&%Cfs}v^e-gAVE%2Y5 zfoq9lC~fW8ht@DI`kdFewZ;|q6X%6RrW^KNZ& z8Hb-Qjz{`_c6K-6@%V@<>hdze$!O518al3Kf+2S5PPWkxx=Qz(h{X~Q&n&er%Z{5m;#OHZO?Dn?c{^0Q(KmFi#r67I>o0{ph_>+<)>eDKJ|8s}H837talF-x3V<`92x!0o{r zLB7DTUPCN`e(zuQQB?@|e(`@7EGK!fHi|LazTXD|eyzOY=rKY5+%KK({zY&I?fx7+ z+3voJ;Pp+j>+TSr*VFj=wO8=m^J@I?;K}}idCcni$>A3P zp4r)U>Zo9TMKj7z;+e(s^8QMbO5+MhJ^q|7-8!nwCb&z1G2=Z_@5b8`yUr7z=d-x9 zxTTUfj&HwJ9E#_kZT&Ny`|9zmwZ((0Mw{{6w8giKtlfg&4Ys&8t)@0bz)!ESA6hBE zPkSoX|0u}g-a7t%jG+HnmXBQVe6_8+{EHF3V+DEgEj4yU0{+j1_5tH*9d%_c{a~8O@(rA zL0{KycEqeAJfK+X?7ZUIj^B%Xop}8Y2mLmDPvLk~UEh)*LEe!S3#3TG<9Q!yLd$0h z@VM5D<&OpUg2n2+nIu2&!#l2cEN>%sY-uG@1rmgMLCUCR4sAHMJKbxQ3pRUH(>$1BT1O@znuemv<&ZmFP; zs;I#g^8|bk|5$H)=jHWy9-r6;e}oJ88K1X1!ud*hSc+R_LIlk1J@EY7ciN^Ob-ZSr4CpBN*L3kW* zG3gt^NPYbIhGWh1f4J9=;OW~BgJmJdV9tF))e5?e)xd{FV4%TKo1mJL6jeiR0^Z;9B^RD#G8G zzkdL}v-12rzP@f)>j1*TpNd04P5@UiN}*7^;yuv62c{+%GpMY0l1-`b2VA8_Tp6fB zPOuv9g!8}Hn(kTwST{HjD=IZ;t4Vc#>`kG@QKbTz3Z-rT&-JFVa!BXO09*}a0OnM6 z=MS>hC7kXI${?(w>RydtQb{_0DU(Jq+uFG@(7Fyi#Huv5vtzN= zc`4K{Ja;v&r$TLAVFk`b>90gY)kB{e>uUE?iSuTc_J@;Ix3Y4_Ol}h?)hl= G*Ui6)Jh?Xj literal 0 HcmV?d00001 diff --git a/tests/rock2.s.translation b/tests/rock2.s.translation new file mode 100644 index 0000000000000000000000000000000000000000..86a186302c38d1718e807de853628226daaaab59 GIT binary patch literal 4534 zcma)A32=>96#kJQA)0oGPKHQPDoXx6?_toW5ou!yVkur0e|Yke7w^4PkQ&6kuNf^O zsHN04GBQmY%h;xtL0fB7M5EyiGqx#hk)Ctky?Uo}&GaAVKj(huJKwqY{O^Ar$wQL+ zNc0K<-;i1h@B?#w&TQvYYur#zT8`J1=5xApC{>agK=kd1)SD0Q92xc+{2xIGaNY&; zSYCIYC&O~M+!<*uhtKWsW>`6v)Qr#Nq-9$YR%BaVZ`ydvD>Z@zsj#F72yam7h zM<{k0`~|SfU^ghnIOuOv?CyVZk751%KNzcf1$YpA+(N;^!4Qw2z7_R|wdLXuXxtUN zjl<(1PTKTnL8kUW0n60Q!l(A?cR{WP89F}z+x=8QUy&vZ9chV{bti|G#N zyzJsGj>qbgu4%>VIUd6&J}O-p$?=(Pdb1W~WgK4Rz3j{qoU5qj=UjZ3SpRu*M$Ea& zty!O$Q@fvg!09o(|KPv6;dcY8XSlKMo~xyx--s)o8TcK*_|wL$TNTXlSiL{L*Ul$` zevvUDh4}undUoDnr<3#{oX(>CD;7-V)=anK&JO-B1o-)954J^dx{Uv#)T`|l@Qq=A zg^v{AYqFxQI|TRx*RJA^x%1#RHTL*r!P59a9NuGk=&jM*dawDQl_AiJ>lxkJFWB$X zt1;>(0YBF9=j?f$F7`(ACI&a{C*YS^Umrgy&@b2;^5_o^htj}%^m0qY4i2xV99901 zTeE(8=h&K?0{nO9ua)r}&UE`u@y^4)z}fS@-tW+vW`c8!tUK25M**Jm`1aWog7eKE zUVNsB053`}8atco$DY%b`^S}h4iB5{&Hj+#ISO_Y~+9`VR&z5b#e_l})J>@R!GIKTsjSeYx7|&4T^RSs#+RT!7Cm zsaUs;>kA=yF7E|}^*_S#F9p}$TO;7jtLunAXI_8)E>zC3>I?RD^Iq-Hg&Yqkq|f$i z;WcjybZZ;BH{D->HXZu@K725C}0iHBG(SLxO2jeeU zvFA|=r_c6xWyat8zvS@DTHn6If_jItK0c4*G2PGlA1x>n>|@`+RwWYz{756E1ODb^ z&xPs4q&)jAQNYhWo9t#>^o)OQT+iz6f_)AwEK98s=(pUKeQJ_`?+Ll|Rw~D5a~V_j zaBwZRpT0xB$xY(w8Sjbz)XWYX?_7(?$*nma+pkNiy1JF)G5nU#eJ+9PkN;}JT-C(y zpETw0tSyJ9HsPws7coz(x%Ki(4U#?*)LoCy z^5gG*Hv5xpOIoILb$g@o8=vRa5R!dIUL3yL!_~1l{ctn!=zfmBw(vmnc3fXpUs3*E zb#sn~?@}AEGr*O*8nXO<@47*l8r(ITiLs%;U5~@NAtRz0aRgB@)@*n;NmeCQB-T~L z4MoRn95NLXv$BTzvW9$F#a+n;W@VzU5PjJsnuMd;v7;J?9aR(6R2})MhH9#TOw~jk zmGn|&R94BJ6+8A))c`_t2u`y$qCX=pZfDZB%qN&(XUx`B<#YTE5q_08{1*>HH zzo%2-bX@?_k!q+&(sh(GH6)n0nv7?ZH8Kc;R0STVfp}o7vO&fw<0%wUC6l2mHslA!8W^`67&n=i YsuDh_Qptx&iPI#hF@0Z>;eTxY0eNz{qyPW_ literal 0 HcmV?d00001 diff --git a/tools/analyze-features.ps1 b/tools/analyze-features.ps1 new file mode 100644 index 0000000..eebf81b --- /dev/null +++ b/tools/analyze-features.ps1 @@ -0,0 +1,73 @@ +<# +.SYNOPSIS + Analizza i CSV prodotti da capture-features.ps1. + +.DESCRIPTION + Per ogni file riporta: + - distribuzione delle etichette emesse; + - media delle feature NORMALIZZATE (cio' che il classificatore vede davvero); + - media dei punteggi grezzi per classe e il divario rispetto alla vincente. + + Serve a rispondere a "perche' sbaglia su questo genere" invece di + ritoccare i pesi a caso. + +.PARAMETER Csv + Uno o piu' file CSV. Il nome del file viene usato come etichetta. + +.PARAMETER SkipSeconds + Righe iniziali da scartare (warm-up del folding ritmico). + +.EXAMPLE + powershell -ExecutionPolicy Bypass -File tools\analyze-features.ps1 -Csv C:\temp\rock.csv,C:\temp\hiphop.csv +#> +param( + [Parameter(Mandatory = $true)][string[]]$Csv, + [int]$SkipSeconds = 16 +) + +$featureNames = @( + "dembow", "fourFloor", "tempo(latin)", "lowRatio", "flatness", + "highRatio", "density", "centroid", "regularity", "regMid", "dynamics" +) +$classCols = @("s_latin", "s_electronic", "s_hiphop", "s_rock", "s_classical") + +foreach ($path in $Csv) { + if (-not (Test-Path $path)) { Write-Host "manca: $path" -ForegroundColor Yellow; continue } + $all = @(Import-Csv $path) + $rows = @($all | Select-Object -Skip $SkipSeconds) + if ($rows.Count -eq 0) { Write-Host "nessuna riga utile in $path" -ForegroundColor Yellow; continue } + + Write-Host "" + Write-Host ("=== {0} ({1} righe utili) ===" -f (Split-Path -Leaf $path), $rows.Count) -ForegroundColor Cyan + + Write-Host "etichette:" + $rows | Group-Object label | Sort-Object Count -Descending | + ForEach-Object { Write-Host (" {0,-11} {1,3} ({2:P0})" -f $_.Name, $_.Count, ($_.Count / $rows.Count)) } + + Write-Host "feature normalizzate (media):" + for ($i = 0; $i -lt $featureNames.Count; $i++) { + $col = "f{0}_*" -f $i + $name = ($rows[0].PSObject.Properties.Name | Where-Object { $_ -like $col } | Select-Object -First 1) + if (-not $name) { continue } + $avg = ($rows | Measure-Object -Property $name -Average).Average + $bar = "#" * [int]([math]::Round($avg * 30)) + Write-Host (" {0,-14} {1,5:F2} {2}" -f $featureNames[$i], $avg, $bar) + } + + Write-Host "punteggi grezzi (media):" + $scores = @{} + foreach ($c in $classCols) { + $scores[$c] = ($rows | Measure-Object -Property $c -Average).Average + } + $best = ($scores.GetEnumerator() | Sort-Object Value -Descending | Select-Object -First 1) + foreach ($c in $classCols) { + $v = $scores[$c] + $gap = $v - $best.Value + $color = if ($c -eq $best.Key) { "Green" } else { "Gray" } + Write-Host (" {0,-14} {1,5:F2} ({2,6:F2})" -f $c.Substring(2), $v, $gap) -ForegroundColor $color + } +} + +Write-Host "" +Write-Host "Nota: 'dynamics' alta premia classical; 'flatness' bassa penalizza rock;" +Write-Host " 'tempo(latin)' e' zero fuori da 85-105 BPM." diff --git a/tools/capture-features.ps1 b/tools/capture-features.ps1 new file mode 100644 index 0000000..21899e0 --- /dev/null +++ b/tools/capture-features.ps1 @@ -0,0 +1,68 @@ +<# +.SYNOPSIS + Registra le feature del classificatore di genere su audio reale. + +.DESCRIPTION + Avvia bin\LoopbackCapture.exe con --dump-features, lascia girare la cattura + per N secondi (durante i quali riproduci i brani da analizzare) e chiude. + + Registra una riga al secondo con feature grezze, feature normalizzate e + punteggi grezzi di ogni classe. Serve alla taratura: senza questi numeri + ogni modifica alle costanti e' un'ipotesi. + +.PARAMETER Out + File CSV di destinazione. Un file per genere e' la scelta piu' comoda: + rock.csv, hiphop.csv, ... + +.PARAMETER Seconds + Durata della cattura. Lascia almeno 20 s per brano: il primo 10-15% e' + warm-up (4 battute) e viene scartato in analisi. + +.PARAMETER Port + Porta di lavoro. Non usare 4242 se il gioco e' in esecuzione. + +.EXAMPLE + powershell -ExecutionPolicy Bypass -File tools\capture-features.ps1 -Out C:\temp\rock.csv -Seconds 120 +#> +param( + [Parameter(Mandatory = $true)][string]$Out, + [int]$Seconds = 90, + [int]$Port = 4340 +) + +$ErrorActionPreference = "Stop" +$root = Split-Path -Parent $PSScriptRoot +$exe = Join-Path $root "bin\LoopbackCapture.exe" +if (-not (Test-Path $exe)) { throw "non trovato: $exe" } + +$Out = [IO.Path]::GetFullPath($Out) +$dir = Split-Path -Parent $Out +if ($dir -and -not (Test-Path $dir)) { New-Item -ItemType Directory -Force -Path $dir | Out-Null } +if (Test-Path $Out) { Remove-Item $Out -Force } + +$proc = Start-Process -FilePath $exe -ArgumentList "$Port", "0", "--dump-features=$Out" -PassThru -WindowStyle Hidden +Start-Sleep -Milliseconds 800 +if ($proc.HasExited) { throw "il bridge e' uscito subito (exit $($proc.ExitCode)). Controlla la porta $Port." } + +Write-Host "" +Write-Host " Registrazione avviata. Riproduci ORA i brani." -ForegroundColor Green +Write-Host " Durata: $Seconds s. Finestra: $Out" +Write-Host "" + +$sw = [Diagnostics.Stopwatch]::StartNew() +while ($sw.Elapsed.TotalSeconds -lt $Seconds) { + $left = [int]($Seconds - $sw.Elapsed.TotalSeconds) + Write-Host ("`r {0,3} s rimanenti " -f $left) -NoNewline + Start-Sleep -Milliseconds 500 + if ($proc.HasExited) { Write-Host ""; Write-Host " il bridge e' terminato in anticipo (exit $($proc.ExitCode))" -ForegroundColor Yellow; break } +} +Write-Host "" + +if (-not $proc.HasExited) { Stop-Process -Id $proc.Id -Force } +Start-Sleep -Milliseconds 400 + +if (-not (Test-Path $Out)) { throw "nessun file prodotto: $Out" } +$rows = (Get-Content $Out | Measure-Object -Line).Lines - 1 +Write-Host (" Righe raccolte: {0}" -f $rows) -ForegroundColor Green +Write-Host (" File: {0}" -f $Out) +if ($rows -lt 10) { Write-Host " Poche righe: l'audio era fermo o troppo basso?" -ForegroundColor Yellow } diff --git a/tools/genre-regression.ps1 b/tools/genre-regression.ps1 new file mode 100644 index 0000000..0e51924 --- /dev/null +++ b/tools/genre-regression.ps1 @@ -0,0 +1,273 @@ +<# +.SYNOPSIS + Regressione del classificatore di genere su pattern sintetici. + +.DESCRIPTION + Genera pattern ritmici/timbrici noti, li riproduce sull'uscita audio di default + e raccoglie le etichette GENR emesse da bin\LoopbackCapture.exe. + + Serve a verificare che una modifica alle costanti del classificatore + (bin\LoopbackCapture.cs, blocco TUNING TABLE) non abbia rotto il + riconoscimento dei casi elementari. NON sostituisce la taratura su musica + reale etichettata: i timbri sintetici sono grezzi e le confidenze non sono + confrontabili con quelle su brani veri. + +.PARAMETER Seconds + Durata della riproduzione per ogni pattern. Deve coprire almeno 4 battute + al tempo piu' lento (70 BPM = 13,7 s) piu' il tempo di aggancio del BPM. + +.PARAMETER Port + Porta UDP di lavoro. Non usare 4242 se il gioco e' in esecuzione. + +.EXAMPLE + powershell -ExecutionPolicy Bypass -File tools\genre-regression.ps1 +#> +param( + [int]$Seconds = 24, + [int]$Port = 4316, + [string]$Only = "" +) + +$ErrorActionPreference = "Stop" +$root = Split-Path -Parent $PSScriptRoot +$exe = Join-Path $root "bin\LoopbackCapture.exe" +if (-not (Test-Path $exe)) { throw "non trovato: $exe" } + +$work = Join-Path $env:TEMP "ldcc-patterns" +New-Item -ItemType Directory -Force -Path $work | Out-Null + +# --- Sintesi --------------------------------------------------------------- +# C# 5: Add-Type su Windows PowerShell 5.1 non accetta sintassi moderna. +if (-not ("LdccSynth" -as [type])) { +Add-Type -TypeDefinition @' +using System; using System.IO; using System.Text; +public static class LdccSynth +{ + const int SR = 44100; + + public static void Build(string path, string kind, double bpm, double seconds) + { + int n = (int)(SR * seconds); + short[] buf = new short[n]; + double sixteenth = 60.0 / bpm / 4.0; + var rnd = new Random(7); + int[] kick, snare, hat; + bool chord = false, tone = false; + + switch (kind) + { + case "dembow": kick = new int[] { 0, 8 }; snare = new int[] { 0,3,6,8,11,14 }; hat = new int[0]; break; + case "fourfloor": kick = new int[] { 0,4,8,12 }; snare = new int[0]; hat = new int[] { 2,6,10,14 }; break; + case "backbeat": kick = new int[] { 0,6,8 }; snare = new int[] { 4,12 }; hat = new int[] { 0,2,4,6,8,10,12,14 }; chord = true; break; + case "boombap": kick = new int[] { 0,6 }; snare = new int[] { 4,12 }; hat = new int[] { 2,6,10,14 }; break; + case "classical": kick = new int[0]; snare = new int[0]; hat = new int[0]; tone = true; break; + default: throw new ArgumentException("kind sconosciuto: " + kind); + } + + for (int b = 0; ; b++) + { + double barStart = b * 16 * sixteenth; + if (barStart >= seconds) break; + foreach (int s in kick) AddKick(buf, barStart + s * sixteenth, 0.85); + foreach (int s in snare) AddSnare(buf, barStart + s * sixteenth, 0.45, rnd); + foreach (int s in hat) AddHat(buf, barStart + s * sixteenth, 0.18, rnd); + if (chord) AddChord(buf, barStart, sixteenth * 8, 0.30, rnd); + } + if (tone) AddTones(buf, seconds, rnd); + + for (int i = 0; i < n; i++) + { + if (buf[i] > 30000) buf[i] = 30000; + if (buf[i] < -30000) buf[i] = -30000; + } + byte[] data = new byte[n * 2]; + Buffer.BlockCopy(buf, 0, data, 0, data.Length); + using (var f = File.Create(path)) + using (var w = new BinaryWriter(f)) + { + w.Write(Encoding.ASCII.GetBytes("RIFF")); w.Write(36 + data.Length); + w.Write(Encoding.ASCII.GetBytes("WAVEfmt ")); w.Write(16); + w.Write((short)1); w.Write((short)1); + w.Write(SR); w.Write(SR * 2); w.Write((short)2); w.Write((short)16); + w.Write(Encoding.ASCII.GetBytes("data")); w.Write(data.Length); + w.Write(data); + } + } + + static void Add(short[] b, int idx, double v) + { + if (idx < 0 || idx >= b.Length) return; + double s = b[idx] + v * 32000.0; + if (s > 30000) s = 30000; + if (s < -30000) s = -30000; + b[idx] = (short)s; + } + + static void AddKick(short[] b, double t0, double amp) + { + int s0 = (int)(t0 * SR), len = (int)(0.35 * SR); + for (int i = 0; i < len; i++) + { + double t = (double)i / SR; + double phase = 2 * Math.PI * (55 * t + (1 - Math.Exp(-t * 40)) / 40); + Add(b, s0 + i, Math.Sin(phase) * Math.Exp(-t * 16) * amp); + } + } + + static void AddSnare(short[] b, double t0, double amp, Random rnd) + { + int s0 = (int)(t0 * SR), len = (int)(0.15 * SR); + for (int i = 0; i < len; i++) + { + double t = (double)i / SR; + double noise = (rnd.NextDouble() * 2 - 1) * Math.Exp(-t * 28); + double body = Math.Sin(2 * Math.PI * 190 * t) * Math.Exp(-t * 30) * 0.4; + Add(b, s0 + i, (noise + body) * amp); + } + } + + static void AddHat(short[] b, double t0, double amp, Random rnd) + { + int s0 = (int)(t0 * SR), len = (int)(0.04 * SR); + double prev = 0; + for (int i = 0; i < len; i++) + { + double t = (double)i / SR; + double x = (rnd.NextDouble() * 2 - 1); + double hp = x - prev; prev = x; // differenziatore: enfasi sugli acuti + Add(b, s0 + i, hp * Math.Exp(-t * 90) * amp); + } + } + + // Accordo distorto: armoniche dense + clipping => spettro piatto, alta energia acuta. + static void AddChord(short[] b, double t0, double dur, double amp, Random rnd) + { + int s0 = (int)(t0 * SR), len = (int)(dur * SR); + double[] roots = { 110.0, 146.83, 164.81 }; + for (int i = 0; i < len; i++) + { + double t = (double)i / SR; + double env = Math.Exp(-t * 3.0); + double v = 0; + foreach (double f in roots) + { + for (int h = 1; h <= 20; h++) + v += Math.Sin(2 * Math.PI * f * h * t + h) / h; + } + double pick = (i < (int)(0.02 * SR)) ? (rnd.NextDouble() * 2 - 1) * 0.5 : 0; + v = Math.Tanh(v * 6.0) * env * amp / 10.0 + pick * 0.25; + Add(b, s0 + i, v); + } + } + + // Arpeggio lento con dinamica ampia: poca percussione, onset radi. + static void AddTones(short[] b, double seconds, Random rnd) + { + double[] notes = { 220.0, 261.63, 329.63, 392.0, 329.63, 261.63 }; + double t = 0; + int i = 0; + while (t < seconds) + { + double f = notes[i % notes.Length]; + double dur = 1.6 + rnd.NextDouble() * 1.2; + double amp = 0.12 + rnd.NextDouble() * 0.5; + int s0 = (int)(t * SR), len = (int)(dur * SR); + for (int k = 0; k < len; k++) + { + double tt = (double)k / SR; + double env = Math.Exp(-tt * 1.2) * (1 - Math.Exp(-tt * 60)); + double v = (Math.Sin(2 * Math.PI * f * tt) + 0.3 * Math.Sin(4 * Math.PI * f * tt)) * env * amp; + Add(b, s0 + k, v); + } + t += dur * 0.85; i++; + } + } +} +'@ -ErrorAction Stop +} + +$patterns = @( + @{ Name = "dembow-95"; Kind = "dembow" }, + @{ Name = "fourfloor-126"; Kind = "fourfloor" }, + @{ Name = "backbeat-140"; Kind = "backbeat" }, + @{ Name = "boombap-90"; Kind = "boombap" }, + @{ Name = "classical-70"; Kind = "classical" } +) + +$expected = @{ + "dembow-95" = "latin" + "fourfloor-126" = "electronic" + "backbeat-140" = "rock" + "boombap-90" = "hiphop" + "classical-70" = "classical" +} + +$results = @() + +foreach ($pat in $patterns) { + if ($Only -and $pat.Name -ne $Only) { continue } + $wav = Join-Path $work ($pat.Name + ".wav") + + if ($pat.Kind -eq "classical") { [LdccSynth]::Build($wav, $pat.Kind, 70, $Seconds + 6) } + else { [LdccSynth]::Build($wav, $pat.Kind, [int]($pat.Name -split '-')[1], $Seconds) } + + $csv = Join-Path $work ($pat.Name + ".csv") + if (Test-Path $csv) { Remove-Item $csv -Force } + + $udp = New-Object System.Net.Sockets.UdpClient($Port) + $udp.Client.ReceiveTimeout = 400 + $ep = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0) + + $proc = Start-Process -FilePath $exe -ArgumentList "$Port", "0", "--dump-features=$csv" -PassThru -WindowStyle Hidden + Start-Sleep -Milliseconds 900 + + $player = New-Object System.Media.SoundPlayer $wav + $player.Play() + + $labels = @() + $sw = [Diagnostics.Stopwatch]::StartNew() + # Raccolta limitata alla durata della riproduzione: il silenzio finale produrrebbe + # etichette "unknown" che non riguardano il pattern. + $limit = $Seconds * 1000 + while ($sw.ElapsedMilliseconds -lt $limit) { + try { + $b = $udp.Receive([ref]$ep) + if ($b.Length -ge 5 -and [Text.Encoding]::ASCII.GetString($b, 0, 5) -eq 'GENR:') { + $txt = [Text.Encoding]::UTF8.GetString($b) + $parts = $txt.Split(';') + if ($parts.Length -ge 3) { $labels += [pscustomobject]@{ Label = $parts[1]; Conf = [double]$parts[2] } } + } + } catch { } + } + + $udp.Close() + if (-not $proc.HasExited) { Stop-Process -Id $proc.Id -Force } + + # Scarta il warm-up: tieni l'ultimo 60% dei campioni. + $skip = [int]($labels.Count * 0.4) + $steady = @($labels | Select-Object -Skip $skip) + + $dominant = "--" + $meanConf = 0.0 + if ($steady.Count -gt 0) { + $g = $steady | Group-Object Label | Sort-Object Count -Descending + $dominant = $g[0].Name + $meanConf = ($steady | Measure-Object Conf -Average).Average + } + + $results += [pscustomobject]@{ + Pattern = $pat.Name + Atteso = $expected[$pat.Name] + Dominante = $dominant + Conf = if ($meanConf) { [math]::Round($meanConf, 2) } else { 0 } + Esito = if ($dominant -eq $expected[$pat.Name]) { "OK" } else { "MISS" } + } + + Write-Host ("{0,-16} atteso={1,-11} ottenuto={2,-11} conf={3}" -f $pat.Name, $expected[$pat.Name], $dominant, [math]::Round($meanConf, 2)) +} + +Write-Host "" +$results | Format-Table -AutoSize +$ok = @($results | Where-Object { $_.Esito -eq "OK" }).Count +Write-Host ("Risultato: {0}/{1} pattern riconosciuti" -f $ok, $results.Count) +Write-Host ("CSV in {0}" -f $work)