commit bffebe4d1c8f05d1029747204dacfc428af68dd2 Author: JorySeverijnse Date: Mon Jan 19 11:34:56 2026 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..047d7bb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +backup/ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c20ac9 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13.3 diff --git a/__pycache__/auto_dj_mix_readable.cpython-313.pyc b/__pycache__/auto_dj_mix_readable.cpython-313.pyc new file mode 100644 index 0000000..c01f363 Binary files /dev/null and b/__pycache__/auto_dj_mix_readable.cpython-313.pyc differ diff --git a/__pycache__/search_and_mix.cpython-313.pyc b/__pycache__/search_and_mix.cpython-313.pyc new file mode 100644 index 0000000..1adcc8d Binary files /dev/null and b/__pycache__/search_and_mix.cpython-313.pyc differ diff --git a/ambient_test_mix.json b/ambient_test_mix.json new file mode 100644 index 0000000..1c84100 --- /dev/null +++ b/ambient_test_mix.json @@ -0,0 +1,501 @@ +{ + "settings": { + "output_filename": "/mnt/opslag/ambient_test_mix_final.flac", + "default_crossfade_duration": "0:00.00", + "pre_mix_target_dbfs": -12.0, + "final_mix_target_dbfs": -1.0 + }, + "tracks": [ + { + "song_path": "/mnt/raid_storage/Music/Brian Eno/ Discreet Music [164531] [1975]/01 - Brian Eno - Discreet Music (Remastered 2004).flac", + "crossfade_duration": "0:00", + "crossfade_start": "0:00", + "no_tempo_adjust": true, + "fade_power": 2.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Shanti Celeste/ Tangerine [120578211] [2019]/01 - Shanti Celeste - Sun Notification.flac", + "crossfade_duration": "0:11.13", + "crossfade_start": "29:14.55", + "start_offset": "0:38.64", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/01 - Aphex Twin - #1.flac", + "crossfade_duration": "0:10.18", + "crossfade_start": "4:58.04", + "start_offset": "0:14.84", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/19 - Aphex Twin - #19.flac", + "crossfade_duration": "0:27.93", + "crossfade_start": "6:41.57", + "start_offset": "0:12.73", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/07 - Aphex Twin - #7.flac", + "crossfade_duration": "0:38.65", + "crossfade_start": "9:20.62", + "start_offset": "0:00.00", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Brian Eno/ Reflection [272550958] [2017]/01 - Brian Eno - Reflection.flac", + "crossfade_duration": "0:17.25", + "crossfade_start": "8:18.48", + "start_offset": "0:00.00", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Steve Roach/ Structures From Silence [333370155] [1984]/03 - Steve Roach - Structures from Silence.flac", + "crossfade_duration": "1:14.72", + "crossfade_start": "60:41.78", + "start_offset": "1:16.78", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/03 - Aphex Twin - #3.flac", + "crossfade_duration": "0:42.00", + "crossfade_start": "27:21.15", + "start_offset": "0:00.72", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/CD 02/Brian Eno - Neroli - 01 - New Space Music.flac", + "crossfade_duration": "0:20.42", + "crossfade_start": "7:09.93", + "start_offset": "0:24.66", + "no_tempo_adjust": true, + "fade_power": 1.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Krxziol/ The feeling of a dark cold winter outside [281504034] [2022]/01 - Krxziol - The feeling of a dark cold winter outside.flac", + "crossfade_duration": "0:30.02", + "crossfade_start": "49:27.22", + "start_offset": "0:16.5", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Tangerine Dream/ Rubycon (Deluxe Version) [110765710] [1975]/01 - Tangerine Dream - Rubycon (Pt. 1 - Remastered 2018).flac", + "crossfade_duration": "0:24.95", + "crossfade_start": "18:48", + "start_offset": "6:52", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Klaus Schulze/ Timewind [3229881] [1975]/01 - Klaus Schulze - Bayreuth Return.flac", + "crossfade_duration": "0:26", + "crossfade_start": "15:38.87", + "start_offset": "0:27.29", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Klaus Schulze/ Mirage (Remastered 2017) [82235529] [1977]/02 - Klaus Schulze - Crystal Lake.flac", + "crossfade_duration": "1:12.87", + "crossfade_start": "22:57.39", + "start_offset": "0:21.67", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Pauline Anna Strom/ Trans-Millenia Music [79870512] [2017]/05 - Pauline Anna Strom - Energies.flac", + "crossfade_duration": "0:12.90", + "crossfade_start": "17:25.48", + "start_offset": "0:03.30", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Art Of Noise/[M] The Ambient Collection [46952148] [1990]/06 - Art Of Noise - Camilla (Remixed by Youth).flac", + "crossfade_duration": "0:33.49", + "crossfade_start": "05:21.06", + "start_offset": "0:03.09", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Klaus Schulze/ Kontinuum [380019868] [2007]/01 - Klaus Schulze - Sequencer (from 70 to 07).flac", + "crossfade_duration": "0:11.10", + "crossfade_start": "07:28.27", + "start_offset": "0:10.57", + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Astral Pilot, Sven Väth/ Electro Acupuncture [63331511] [1995]/06 - Astral Pilot, Sven Väth - The Day After.flac", + "crossfade_duration": "0:10.38", + "crossfade_start": "19:47.06", + "start_offset": "0:00.00", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Biosphere/ Cirque [4186861] [2000]/06 - Biosphere - When I Leave.flac", + "crossfade_duration": "0:02.05", + "crossfade_start": "20:47.80", + "start_offset": "0:48.07", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Primal Code/Primal Code - Caimano Tribe (2019 ep, XW)/04 - Primal Code - Conjuration.flac", + "crossfade_duration": "0:04.28", + "crossfade_start": "04:43.96", + "start_offset": "0:50.75", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Primal Code/La Via della Seta [94401315] [2018]/07 - Primal Code - Magellano.flac", + "crossfade_duration": "0:02.28", + "crossfade_start": "05:25.09", + "start_offset": "0:25.30", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/04 Kollektiv Turmstrasse - Ordinary (Lake People's Circle Motive remix).flac", + "crossfade_duration": "0:30.37", + "crossfade_start": "03:32.75", + "start_offset": "0:00.00", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/York [266760278] [2015]/03 - Christian Löffler - Nordkap (Original Mix).flac", + "crossfade_duration": "0:03.97", + "crossfade_start": "04:57.61", + "start_offset": "0:44.21", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/Mare [88102248] [2016]/06 - Christian Löffler - Lid.flac", + "crossfade_duration": "0:20.05", + "crossfade_start": "06:17.09", + "start_offset": "0:00.00", + "tempo_multiplier": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Various Artists/ Naba VA 002 [103500941] [2019]/02 - Münch - Note (Original Mix).flac", + "crossfade_start": "2:40.18", + "crossfade_duration": "2:24.00", + "fade_in_duration": "0:20.00", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true, + "eq_filters": [ + { + "type": "high_pass", + "cutoff_hz": 80, + "start_time": "7:21.99", + "end_time": "7:51.99" + }, + { + "type": "high_pass", + "cutoff_hz": 120, + "start_time": "7:51.99", + "end_time": "8:21.99" + }, + { + "type": "high_pass", + "cutoff_hz": 180, + "start_time": "8:21.99", + "end_time": "8:51.99" + }, + { + "type": "high_pass", + "cutoff_hz": 250, + "start_time": "8:51.99", + "end_time": "9:21.99" + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/A Forest [88101930] [2012]/03 - Christian Löffler - Eleven.flac", + "crossfade_start": "5:36.00", + "crossfade_duration": "10:00.00", + "fade_in_duration": "0:15.00", + "fade_power": 0.0, + "no_tempo_adjust": true, + "eq_filters": [ + { + "type": "high_pass", + "cutoff_hz": 250, + "start_time": "0:00.00", + "end_time": "0:30.00" + }, + { + "type": "high_pass", + "cutoff_hz": 180, + "start_time": "0:30.00", + "end_time": "1:00.00" + }, + { + "type": "high_pass", + "cutoff_hz": 120, + "start_time": "1:00.00", + "end_time": "1:30.00" + }, + { + "type": "high_pass", + "cutoff_hz": 80, + "start_time": "1:30.00", + "end_time": "2:00.00" + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/Young Alaska [88102745] [2014]/04 - Christian Löffler - Beirut.flac", + "start_offset": "0:04.56", + "crossfade_start": "5:36.00", + "crossfade_duration": "1:00.00", + "fade_in_duration": "0:10.00", + "fade_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Kiasmos/Kiasmos [103318515] [2014]/03 - Kiasmos - Looped.flac", + "crossfade_start": "6:48.56", + "crossfade_duration": "0:47.75", + "fade_in_duration": "0:05.00", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true, + "loops": [ + { + "start_time": "5:46.83", + "end_time": "5:58.78", + "count": 1 + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Kiasmos/Blurred [103386930] [2017]/03 - Kiasmos - Jarred.flac", + "crossfade_start": "5:24.04", + "start_offset": "0:00.17", + "crossfade_duration": "1:30.00", + "fade_in_duration": "0:05.00", + "fade_power": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Marcu Rares/ Soul Bonding [175595586] [2021]/01 - Marcu Rares - Soul Bonding.flac", + "crossfade_start": "5:00.17", + "start_offset": "4:56.13", + "crossfade_duration": "0:35.33", + "fade_in_duration": "0:30.00", + "fade_power": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Rone/Mirapolis [78562101] [2017]/11 - Rone - Mirapolis.flac", + "crossfade_start": "12:35.64", + "start_offset": "0:02.81", + "crossfade_duration": "2:00.00", + "fade_in_duration": "0:45.00", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": false, + "apply_pre_mix_normalization": false, + "target_dBFS": -18.0 + }, + { + "song_path": "/mnt/raid_storage/Music/Various Artists/ Grand Cru 2008 [18274893] [2008]/02 - Wareika - Fantasy (Wareika Remix).flac", + "crossfade_start": "4:22.32", + "start_offset": "0:00.37", + "crossfade_duration": "2:00.00", + "fade_in_duration": "2:00.00", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Daso/ All My People [86109655] [2012]/02 - Daso - Dan Lyke.flac", + "crossfade_start": "5:35.37", + "start_offset": "0:00.24", + "crossfade_duration": "0:35.22", + "fade_in_duration": "0:35.22", + "fade_in_power": 0.0, + "fade_out_power": 1.0, + "fade_out_delay": "0:25.22", + "no_tempo_adjust": false, + "tempo_ramps": [ + { + "start_time": "3:32.61", + "end_time": "4:44.74", + "end_tempo":121.0 + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/A Forest [88101930] [2012]/07 - Christian Löffler - Blind.flac", + "crossfade_start": "6:44.37", + "start_offset": "0:23.80", + "crossfade_duration": "0:43.65", + "fade_in_duration": "0:09.92", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Stephan Bodzin/ Powers of Ten [45241387] [2015]/01 - Stephan Bodzin - Singularity.flac", + "crossfade_start": "4:33.72", + "start_offset": "0:55.53", + "crossfade_duration": "2:11.90", + "fade_in_duration": "0:07.00", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Daniel Avery/Drone Logic [43421119] [2013]/07 - Daniel Avery - Need Electric (Album Version).flac", + "crossfade_start": "5:17.35", + "start_offset": "0:00.17", + "crossfade_duration": "1:43.95", + "fade_in_duration": "0:55.04", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": false + }, + { + "song_path": "/mnt/raid_storage/Music/Sascha Funke/ Mango [87379506] [2008]/02 - Sascha Funke - We Are Facing the Sun.flac", + "crossfade_start": "3:24.51", + "start_offset": "0:00.12", + "crossfade_duration": "0:31.23", + "fade_in_duration": "0:07.63", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Bicep/Just EP [184785872] [2015]/03 - Bicep - Back 2 U.flac", + "crossfade_start": "6:17.58", + "start_offset": "0:00.01", + "crossfade_duration": "0:52.63", + "fade_in_duration": "0:31.48", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true, + "band_gains": [ + { + "start_time": "7:16.73", + "end_time": "7:24.60", + "high_gain_db": -24.0 + } + ] + + }, + { + "song_path": "/mnt/raid_storage/Music/Various Artists/ HDC003 [352797419] [2016]/02 - Baltra - Tears Drop.flac", + "crossfade_start": "6:17.71", + "start_offset": "0:00.97", + "crossfade_duration": "1:26.55", + "fade_in_duration": "1:02.95", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true, + "band_gains": [ + { + "start_time": "5:59.01", + "end_time": "6:18.68", + "low_gain_db": -24.0 + } + ] + + }, + { + "song_path": "/mnt/raid_storage/Music/Various Artists/ Memories, Pt. I [139085472] [2017]/05 - Thomas Wood - Cave.flac", + "crossfade_start": "5:47.20", + "start_offset": "0:00.01", + "crossfade_duration": "0:49.18", + "fade_in_duration": "0:14.76", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "fade_out_delay": "0:30.00", + "no_tempo_adjust": false, + "loops": [ + { + "start_time": "5:33.68", + "end_time": "5:37.61", + "count": 28 + } + ] + + }, + { + "song_path": "/mnt/raid_storage/Music/Bicep/Bicep [75160673] [2017]/12 - Bicep - Aura.flac", + "crossfade_start": "4:50.93", + "start_offset": "1:02.44", + "crossfade_duration": "3:59.23", + "fade_in_duration": "0:31.44", + "fade_in_power": 1.0, + "fade_out_power": 1.0, + "no_tempo_adjust": false, + "tempo_ramps": [ + { + "start_time": "3:38.54", + "end_time": "4:01.96", + "end_tempo":123.0 + } + ] + + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/A Forest [88101930] [2012]/11 - Christian Löffler - A Hundred Lights.flac", + "crossfade_start": "4:01.96", + "start_offset": "0:00.19", + "crossfade_duration": "1:13.17", + "fade_in_duration": "0:46.83", + "fade_in_power": 1.0, + "fade_out_power": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Robag Wruhme/ Olgamikks [16676895] [2012]/10 - Extrawelt - Neuland (Robags Rexmow 001).flac", + "crossfade_start": "6:02.63", + "start_offset": "0:00.00", + "crossfade_duration": "0:55.68", + "fade_in_duration": "0:31.22", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Leon Vynehall/ Music for the Uninvited [168277757] [2014]/02 - Leon Vynehall - Goodthing.flac", + "crossfade_start": "5:12.19", + "start_offset": "0:23.45", + "crossfade_duration": "0:42.93", + "fade_in_duration": "0:10.73", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": false, + "tempo_ramps": [ + { + "start_time": "2:08.26", + "end_time": "4:01.96", + "end_tempo":124 + } + ] + + }, + { + "song_path": "/mnt/raid_storage/Music/DJ Boring/ Sunday Avenue [284620418] [2017]/02 - DJ Boring - 6 AM Mimosa.flac", + "crossfade_start": "5:06.03", + "start_offset": "0:00.00", + "crossfade_duration": "0:42.93", + "fade_in_duration": "0:12.10", + "fade_in_power": 1.0, + "fade_out_power": 0.0, + "no_tempo_adjust": true + } + + ] +} diff --git a/auto_dj_mix.py b/auto_dj_mix.py new file mode 100644 index 0000000..6cb4ac4 --- /dev/null +++ b/auto_dj_mix.py @@ -0,0 +1,806 @@ +import librosa +import numpy as np +import soundfile as sf +from pydub import AudioSegment +import pyrubberband +import os +from tqdm import tqdm +import logging +import json +import argparse +import subprocess +from multiprocessing import Pool, cpu_count, Manager +import sys +import math +import tempfile +import copy + +def apply_ffmpeg_effect(segment, effect_filter_str): + """Applies an FFmpeg audio filter to an AudioSegment using unique temp files.""" + if len(segment) <= 0: + return AudioSegment.empty() + + if len(segment) < 10: + segment = segment + AudioSegment.silent(duration=10) + + with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp_in: + tmp_in_path = tmp_in.name + with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp_out: + tmp_out_path = tmp_out.name + + try: + segment.export(tmp_in_path, format="wav") + + command = [ + "ffmpeg", + "-i", tmp_in_path, + "-af", effect_filter_str, + "-y", + tmp_out_path + ] + subprocess.run(command, check=True, capture_output=True, text=True) + processed_segment = AudioSegment.from_file(tmp_out_path) + + except subprocess.CalledProcessError as e: + logging.error(f"FFmpeg effect failed! Filter: {effect_filter_str}") + logging.error(f"FFmpeg stderr:\n{e.stderr}") + processed_segment = segment + except Exception as e: + logging.error(f"Unexpected error in apply_ffmpeg_effect: {e}") + processed_segment = segment + finally: + for path in (tmp_in_path, tmp_out_path): + try: + if os.path.exists(path): + os.remove(path) + except: + pass + + return processed_segment + +def load_tempo_cache(cache_path='tempo_cache.json'): + if os.path.exists(cache_path): + with open(cache_path, 'r') as f: + return json.load(f) + return {} + +def save_tempo_cache(cache, cache_path='tempo_cache.json'): + with open(cache_path, 'w') as f: + json.dump(cache, f, indent=4) + +def setup_logging(level=logging.INFO): + logging.basicConfig(level=level, format="%(asctime)s - %(levelname)s - %(message)s") + +def normalize_audio(audio_segment, target_dbfs=-1.0): + peak_dbfs = audio_segment.max_dBFS + change_in_dbfs = target_dbfs - peak_dbfs + return audio_segment.apply_gain(change_in_dbfs) + +def apply_custom_fade(segment, fade_type, duration, fade_power): + if duration == 0 or len(segment) == 0 or fade_power == 0: + return segment + + num_samples = int(segment.frame_count()) + if num_samples == 0: return segment + + t = np.linspace(0.0, 1.0, num_samples) + + if fade_type == 'in': + gain_curve = t ** fade_power + elif fade_type == 'out': + gain_curve = (1.0 - t) ** fade_power + else: + return segment + + samples = np.array(segment.get_array_of_samples()).astype(np.float64) + samples = samples.reshape((-1, segment.channels)) + samples[:] *= gain_curve[:, np.newaxis] + faded_samples = samples.flatten().astype(segment.array_type) + return AudioSegment(data=faded_samples.tobytes(), sample_width=segment.sample_width, frame_rate=segment.frame_rate, channels=segment.channels) + +def parse_time(tstr): + parts = str(tstr).split(':') + parts = [float(p) for p in parts] + if len(parts) == 3: + h, m, s = parts + elif len(parts) == 2: + h = 0 + m, s = parts + else: + raise ValueError("Invalid time format") + return int((h*3600 + m*60 + s)*1000) + +def add_flac_chapters(file_path, chapters): + logger = logging.getLogger(__name__) + logger.info(f"Adding {len(chapters)} chapter markers to {file_path}") + + for i, (start_time_ms, title) in enumerate(chapters): + ms = start_time_ms % 1000 + secs = (start_time_ms // 1000) % 60 + mins = (start_time_ms // (1000 * 60)) % 60 + hours = (start_time_ms // (1000 * 3600)) + start_time_str = f"{hours:02}:{mins:02}:{secs:02}.{ms:03}" + + command = [ + "metaflac", + f"--set-tag=CHAPTER{i+1:02}={start_time_str}", + f"--set-tag=CHAPTER{i+1:02}NAME={title}", + file_path + ] + try: + subprocess.run(command, check=True, capture_output=True, text=True) + except (subprocess.CalledProcessError, FileNotFoundError): + logger.error(f"Error running metaflac for chapter {i+1}.") + break + +def get_reliable_tempo(audio, sample_rate, song_path, tempo_cache, default_tempo=120.0): + logger = logging.getLogger(__name__) + if song_path in tempo_cache: + logger.info(f"Using cached tempo for {song_path}: {tempo_cache[song_path]}") + return tempo_cache[song_path] + + try: + tempo = librosa.feature.tempo(y=audio, sr=sample_rate)[0] + if not np.isfinite(tempo) or tempo <= 0: + tempo = default_tempo + tempo_cache[song_path] = float(tempo) + logger.info(f"Detected tempo for {song_path}: {tempo}") + return float(tempo) + except Exception as e: + logger.warning(f"Tempo detection failed for {song_path}: {e}. Using default tempo {default_tempo}") + return default_tempo + +def get_normalized_ramps(config, start_offset_ms): + """Extracts ramps from config and adjusts start/end times by subtracting the start_offset.""" + raw_ramps = config.get("tempo_ramps", config.get("temp_ramps", [])) + if not raw_ramps: + return [] + + normalized_ramps = [] + for ramp in raw_ramps: + new_ramp = copy.deepcopy(ramp) + s_time = parse_time(ramp["start_time"]) + e_time = parse_time(ramp["end_time"]) + + # Shift times to be relative to the trimmed audio start + adj_s_time = max(0, s_time - start_offset_ms) + adj_e_time = max(0, e_time - start_offset_ms) + + new_ramp["start_time_ms"] = adj_s_time + new_ramp["end_time_ms"] = adj_e_time + + if adj_e_time > adj_s_time: + normalized_ramps.append(new_ramp) + + return sorted(normalized_ramps, key=lambda r: r["start_time_ms"]) + +def apply_tempo_ramps(y, sr, normalized_ramps, original_tempo, ref_tempo): + logger = logging.getLogger(__name__) + + if not normalized_ramps: + return y + + # Create paths but don't keep them open + tmp_in = tempfile.NamedTemporaryFile(suffix='.wav', delete=False) + tmp_in_path = tmp_in.name + tmp_in.close() + + tmp_out = tempfile.NamedTemporaryFile(suffix='.wav', delete=False) + tmp_out_path = tmp_out.name + tmp_out.close() + + tmp_map = tempfile.NamedTemporaryFile(suffix='.txt', delete=False) + tmp_map_path = tmp_map.name + tmp_map.close() + + try: + # 1. Write the audio to disk as standard 16-bit PCM WAV + sf.write(tmp_in_path, y, sr, subtype='PCM_16') + + # 2. Generate the Time Map + map_points = [] + map_points.append(f"0 0\n") + + current_sample_in = 0.0 + current_sample_out = 0.0 + current_tempo = ref_tempo if ref_tempo else original_tempo + + CHUNK_SIZE = 1024 + total_samples = len(y) + + ramps = sorted(normalized_ramps, key=lambda r: r["start_time_ms"]) + + while current_sample_in < total_samples: + time_ms = (current_sample_in / sr) * 1000.0 + + instant_tempo = current_tempo + + # Find active ramp + for ramp in ramps: + if ramp["start_time_ms"] <= time_ms <= ramp["end_time_ms"]: + ramp_start_tempo = ref_tempo if ref_tempo else original_tempo + for prev_ramp in ramps: + if prev_ramp["end_time_ms"] <= ramp["start_time_ms"]: + ramp_start_tempo = float(prev_ramp["end_tempo"]) + + dur = ramp["end_time_ms"] - ramp["start_time_ms"] + if dur > 0: + prog = (time_ms - ramp["start_time_ms"]) / dur + instant_tempo = ramp_start_tempo + (float(ramp["end_tempo"]) - ramp_start_tempo) * prog + break + elif time_ms > ramp["end_time_ms"]: + instant_tempo = float(ramp["end_tempo"]) + + # Calculate stretch ratio + ratio = instant_tempo / original_tempo + + # Advance + samples_added = CHUNK_SIZE / ratio + current_sample_in += CHUNK_SIZE + current_sample_out += samples_added + + # Only write points that are within the file bounds + if current_sample_in < total_samples: + map_points.append(f"{int(current_sample_in)} {int(current_sample_out)}\n") + + # Add the final exact end point to the map to ensure completeness + map_points.append(f"{total_samples} {int(current_sample_out)}\n") + + # Write map file + with open(tmp_map_path, 'w') as f: + f.writelines(map_points) + + # Calculate total expected duration in seconds for the -D flag + total_duration_sec = current_sample_out / sr + + # 3. Run Rubberband CLI + # We use -D to specify the duration (REQUIRED by your version when using --timemap) + # We removed --threading and --precise as they are not supported by your version + # We use -q for quiet mode + command = [ + "rubberband", + "--quiet", + "--timemap", tmp_map_path, + "-D", str(total_duration_sec), + tmp_in_path, + tmp_out_path + ] + + subprocess.run(command, check=True, capture_output=True, text=True) + + # 4. Load result + y_processed, _ = sf.read(tmp_out_path, dtype='float32') + + # Fix dimensions if mono/stereo mismatch occurs + if y.ndim == 2 and y_processed.ndim == 1: + y_processed = np.column_stack((y_processed, y_processed)) + elif y.ndim == 1 and y_processed.ndim == 2: + y_processed = librosa.to_mono(y_processed.T) + + return y_processed + + except subprocess.CalledProcessError as e: + logger.error("Rubberband CLI failed.") + logger.error(f"Stderr: {e.stderr}") + return y + except Exception as e: + logger.error(f"Map generation failed: {e}") + return y + finally: + for p in [tmp_in_path, tmp_out_path, tmp_map_path]: + if os.path.exists(p): + try: + os.remove(p) + except: + pass + +def compute_mapped_time(original_pos_sec, normalized_ramps, original_tempo, ref_tempo, total_original_duration_sec): + """Computes time in stretched audio using normalized (0-based) ramps.""" + if not normalized_ramps and ref_tempo is None: + return original_pos_sec + if not normalized_ramps and ref_tempo is not None: + return original_pos_sec * (original_tempo / ref_tempo) + + current_time = 0.0 + mapped_time = 0.0 + current_tempo = ref_tempo if ref_tempo else original_tempo + + for ramp in normalized_ramps: + start = ramp["start_time_ms"] / 1000.0 + end = ramp["end_time_ms"] / 1000.0 + end_tempo = float(ramp["end_tempo"]) + + if start < current_time: continue + + # Constant segment before ramp + if start > current_time: + seg_dur = min(start, original_pos_sec) - current_time + if seg_dur > 0: + mapped_time += seg_dur * (original_tempo / current_tempo) + current_time += seg_dur + if current_time >= original_pos_sec: return mapped_time + + # Ramp segment + ramp_dur = end - start + a = current_tempo + b = (end_tempo - current_tempo) / ramp_dur + u = min(original_pos_sec, end) - start + + if u > 0: + if abs(b) < 1e-9: + mapped_time += u * (original_tempo / a) + else: + mapped_time += original_tempo * (math.log(a + b * u) - math.log(a)) / b + current_time += u + if current_time >= original_pos_sec: return mapped_time + + current_tempo = end_tempo + current_time = end + + # Final constant segment + seg_dur = max(0, original_pos_sec - current_time) + if seg_dur > 0: + mapped_time += seg_dur * (original_tempo / current_tempo) + + return mapped_time + +def process_song(config, index, tempo_cache, settings, reference_tempo=None, sample_rate=None): + log_messages = [] + song_path = config["song_path"] + start_offset = parse_time(config.get("start_offset", "0:00")) + no_tempo_adjust = config.get("no_tempo_adjust", False) + + log_messages.append(f"Processing song {index+1}: {song_path}") + + try: + audio_segment = AudioSegment.from_file(song_path) + + if start_offset > 0: + audio_segment = audio_segment[start_offset:] + + # 1. Convert Audio to Arrays for Analysis/Processing EARLY (Needed for Loop Snapping) + full_duration = len(audio_segment) + y_raw = np.array(audio_segment.get_array_of_samples()).astype(np.float32) + y_raw /= (1 << (8 * audio_segment.sample_width - 1)) + + if audio_segment.channels == 2: + y_stereo = y_raw.reshape((-1, 2)) + y_mono = librosa.to_mono(y_stereo.T) + else: + y_mono = y_raw if audio_segment.channels == 1 else librosa.to_mono(y_raw.reshape((-1, audio_segment.channels)).T) + y_stereo = np.column_stack((y_mono, y_mono)) + + current_sample_rate = audio_segment.frame_rate + if sample_rate is None: + sample_rate = current_sample_rate + + # 2. Detect Tempo EARLY + tempo = get_reliable_tempo(y_mono, sample_rate, song_path, tempo_cache) + + # --- Apply Loops (With BPM Grid Snapping) --- + if "loops" in config: + # We need to reconstruct audio_segment because loops change the length + # We'll do this by slicing the original audio_segment based on calculated times + new_audio = AudioSegment.empty() + + # Sort loops by time to handle them sequentially + loops = sorted(config["loops"], key=lambda x: parse_time(x.get("start_time", "0:00"))) + + current_pos = 0 + + for loop in loops: + loop_start_ms = parse_time(loop.get("start_time", "0:00")) + loop_end_ms = parse_time(loop.get("end_time")) + count = int(loop.get("count", 1)) + + if loop_start_ms >= loop_end_ms: continue + + # Add audio BEFORE the loop + if loop_start_ms > current_pos: + new_audio += audio_segment[current_pos:loop_start_ms] + + # --- GRID SNAPPING LOGIC --- + # Calculate exact beat duration at this song's tempo + beat_len_ms = (60.0 / tempo) * 1000.0 + + # How long is the user's manual loop? + user_loop_duration_ms = loop_end_ms - loop_start_ms + + # How many beats is that likely to be? (Round to nearest whole beat) + num_beats = round(user_loop_duration_ms / beat_len_ms) + if num_beats == 0: num_beats = 1 # Prevent division by zero for tiny loops + + # What is the PERFECT grid length for that many beats? + perfect_duration_ms = num_beats * beat_len_ms + + log_messages.append(f"Loop Correction: {user_loop_duration_ms}ms -> {perfect_duration_ms:.2f}ms ({num_beats} beats @ {tempo} BPM)") + + # Extract the loop audio + loop_segment = audio_segment[loop_start_ms:loop_end_ms] + + # Time-Stretch the loop segment to match perfect_duration_ms exactly + # This ensures 28 loops don't drift by even 1 millisecond. + + # Convert loop to numpy for rubberband + l_raw = np.array(loop_segment.get_array_of_samples()).astype(np.float32) + l_raw /= (1 << (8 * loop_segment.sample_width - 1)) + if loop_segment.channels == 2: + l_stereo = l_raw.reshape((-1, 2)) + else: + l_mono = l_raw + l_stereo = np.column_stack((l_mono, l_mono)) + + # Stretch Factor + # If user cut is 3.93s and perfect is 3.931s, we stretch by ~1.0002 (imperceptible pitch change) + stretch_ratio = perfect_duration_ms / user_loop_duration_ms + + # In rubberband: ratio > 1.0 is shorter/faster. We want longer duration. + # duration_new = duration_old * stretch_rate ?? No. + # pyrubberband time_stretch(y, sr, rate). rate=2.0 makes it half duration. + # We want duration to go from User -> Perfect. + # rate = User / Perfect. + rb_rate = user_loop_duration_ms / perfect_duration_ms + + l_stretched_data = pyrubberband.time_stretch(l_stereo, sample_rate, rb_rate) + + # Convert back to AudioSegment + # Ensure 16-bit PCM for Pydub compatibility + l_stretched_data_int = (l_stretched_data * (2**15 - 1)).astype(np.int16) + perfect_loop_segment = AudioSegment( + l_stretched_data_int.tobytes(), + frame_rate=sample_rate, + sample_width=2, + channels=2 + ) + + # Append the snapped loop X times + new_audio += (perfect_loop_segment * count) + + current_pos = loop_end_ms + + # Add remaining audio after the last loop + if current_pos < len(audio_segment): + new_audio += audio_segment[current_pos:] + + audio_segment = new_audio + + # --- Apply EQ Filters --- + if "eq_filters" in config: + for eq_filter in config["eq_filters"]: + filter_type = eq_filter.get("type") + cutoff_hz = eq_filter.get("cutoff_hz") + start_ms = parse_time(eq_filter.get("start_time", "0:00")) + end_time_str = eq_filter.get("end_time") + end_ms = parse_time(end_time_str) if end_time_str else len(audio_segment) + + if not filter_type or not cutoff_hz or start_ms >= end_ms: continue + + pre_segment = audio_segment[:start_ms] + segment_to_filter = audio_segment[start_ms:end_ms] + post_segment = audio_segment[end_ms:] + + if filter_type == "low_pass": + filtered_slice = segment_to_filter.low_pass_filter(cutoff_hz) + elif filter_type == "high_pass": + filtered_slice = segment_to_filter.high_pass_filter(cutoff_hz) + elif filter_type == "band_pass": + low, high = eq_filter.get("low_cutoff_hz"), eq_filter.get("high_cutoff_hz") + filtered_slice = segment_to_filter.high_pass_filter(low).low_pass_filter(high) if low and high else segment_to_filter + elif filter_type == "band_reject": + low, high = eq_filter.get("low_cutoff_hz"), eq_filter.get("high_cutoff_hz") + filtered_slice = segment_to_filter.low_pass_filter(low).overlay(segment_to_filter.high_pass_filter(high)) if low and high else segment_to_filter + else: + filtered_slice = segment_to_filter + + audio_segment = pre_segment + filtered_slice + post_segment + + # --- Apply Volume Automation --- + if "volume_automation" in config: + for automation in config["volume_automation"]: + start_ms = parse_time(automation.get("start_time", "0:00")) + end_time_str = automation.get("end_time") + end_ms = parse_time(end_time_str) if end_time_str else len(audio_segment) + gain_db = float(automation.get("gain_db", 0)) + + if start_ms >= end_ms: continue + + pre_segment = audio_segment[:start_ms] + segment_to_automate = audio_segment[start_ms:end_ms] + post_segment = audio_segment[end_ms:] + audio_segment = pre_segment + segment_to_automate.apply_gain(gain_db) + post_segment + + # --- Apply Band Gains (With Ramping) --- + if "band_gains" in config: + for band_gain in config["band_gains"]: + start_ms = parse_time(band_gain.get("start_time", "0:00")) + end_time_str = band_gain.get("end_time") + end_ms = parse_time(end_time_str) if end_time_str else len(audio_segment) + target_low_gain_db = float(band_gain.get("low_gain_db", 0)) + target_mid_gain_db = float(band_gain.get("mid_gain_db", 0)) + target_high_gain_db = float(band_gain.get("high_gain_db", 0)) + + if start_ms >= end_ms: continue + if target_low_gain_db == 0 and target_mid_gain_db == 0 and target_high_gain_db == 0: + continue + + pre_segment = audio_segment[:start_ms] + segment_to_process = audio_segment[start_ms:end_ms] + post_segment = audio_segment[end_ms:] + + ramp_duration_ms = len(segment_to_process) + if ramp_duration_ms <= 0: continue + + chunk_duration_ms = 250 + num_chunks = max(2, int(ramp_duration_ms / chunk_duration_ms)) + chunk_duration_ms = ramp_duration_ms / num_chunks + + processed_chunks = [] + for i in range(num_chunks): + chunk_start_ms = int(i * chunk_duration_ms) + chunk_end_ms = int((i + 1) * chunk_duration_ms) + chunk = segment_to_process[chunk_start_ms:chunk_end_ms] + + if len(chunk) == 0: continue + + t = (i + 0.5) / num_chunks + low_gain = t * target_low_gain_db + mid_gain = t * target_mid_gain_db + high_gain = t * target_high_gain_db + + filter_str = [] + if low_gain != 0: filter_str.append(f"bass=g={low_gain}:f=250:w=0.707") + if mid_gain != 0: filter_str.append(f"equalizer=f=1000:t=q:w=1:g={mid_gain}") + if high_gain != 0: filter_str.append(f"treble=g={high_gain}:f=2500:w=0.707") + + if filter_str: + processed_chunk = apply_ffmpeg_effect(chunk, ",".join(filter_str)) + else: + processed_chunk = chunk + processed_chunks.append(processed_chunk) + + processed_segment = AudioSegment.empty() + for chunk in processed_chunks: + processed_segment += chunk + + filter_str_post = [] + if target_low_gain_db != 0: filter_str_post.append(f"bass=g={target_low_gain_db}:f=250:w=0.707") + if target_mid_gain_db != 0: filter_str_post.append(f"equalizer=f=1000:t=q:w=1:g={target_mid_gain_db}") + if target_high_gain_db != 0: filter_str_post.append(f"treble=g={target_high_gain_db}:f=2500:w=0.707") + + if filter_str_post and len(post_segment) > 0: + post_segment = apply_ffmpeg_effect(post_segment, ",".join(filter_str_post)) + + audio_segment = pre_segment + processed_segment + post_segment + + # --- Apply Effects --- + if "effects" in config: + for effect in config["effects"]: + start_ms = parse_time(effect.get("start_time", "0:00")) + end_time_str = effect.get("end_time") + end_ms = parse_time(end_time_str) if end_time_str else len(audio_segment) + effect_type = effect.get("type") + + if start_ms >= end_ms: continue + + pre_segment = audio_segment[:start_ms] + segment_to_process = audio_segment[start_ms:end_ms] + post_segment = audio_segment[end_ms:] + + effect_str = "" + if effect_type == "reverb": + wet = effect.get("wet", 0.4) + effect_str = f"afftfilt=real='hypot(re,im)*cos(random(0))*{wet}+re*(1-{wet})':imag='hypot(re,im)*sin(random(0))*{wet}+im*(1-{wet})'" + elif effect_type == "delay": + delay_ms = effect.get("delay_ms", 500) + effect_str = f"adelay=delays={delay_ms}:all=1" + elif effect_type == "raw_ffmpeg": + effect_str = effect.get("filter_string", "") + + if effect_str: + processed_slice = apply_ffmpeg_effect(segment_to_process, effect_str) + audio_segment = pre_segment + processed_slice + post_segment + + # Apply pre-mix normalization + pre_mix_target_dbfs = config.get("target_dBFS", settings.get("pre_mix_target_dbfs", -12.0)) + if config.get("apply_pre_mix_normalization", True): + audio_segment = normalize_audio(audio_segment, pre_mix_target_dbfs) + + full_duration = len(audio_segment) + + # Prepare Final Output for Stretch + y_raw = np.array(audio_segment.get_array_of_samples()).astype(np.float32) + y_raw /= (1 << (8 * audio_segment.sample_width - 1)) + + if audio_segment.channels == 2: + y_stereo = y_raw.reshape((-1, 2)) + y_mono = librosa.to_mono(y_stereo.T) + else: + y_mono = y_raw if audio_segment.channels == 1 else librosa.to_mono(y_raw.reshape((-1, audio_segment.channels)).T) + y_stereo = np.column_stack((y_mono, y_mono)) + + # Tempo Detection (Already done earlier, reusing value) + + # Logic for Ramps and Adjustments + normalized_ramps = get_normalized_ramps(config, start_offset) + + effective_ref = None if no_tempo_adjust else reference_tempo + final_output_tempo = tempo + + stretched_audio = y_stereo + + if normalized_ramps: + log_messages.append(f"Applying tempo ramps with initial ref {effective_ref if effective_ref else tempo}") + stretched_audio = apply_tempo_ramps(stretched_audio, sample_rate, normalized_ramps, tempo, effective_ref) + final_output_tempo = float(normalized_ramps[-1]["end_tempo"]) + elif index > 0 and not no_tempo_adjust: + stretch_rate = reference_tempo / tempo + stretched_audio = pyrubberband.time_stretch(y_stereo, sample_rate, stretch_rate) + final_output_tempo = reference_tempo + else: + final_output_tempo = tempo + + temp_file = f"temp_song{index}.flac" + sf.write(temp_file, stretched_audio, sample_rate) + + return temp_file, sample_rate, tempo, full_duration, len(AudioSegment.from_file(temp_file)), log_messages, final_output_tempo, normalized_ramps + + except Exception as e: + logging.error(f"Error processing {song_path}: {e}") + return None, None, None, None, None, [f"ERROR: Failed to process {song_path}"], None, [] + +def mix_songs(playlist_data): + settings = playlist_data["settings"] + song_configs = playlist_data["tracks"] + output_file = settings.get("output_filename", "mix_output.flac") + default_crossfade = settings.get("default_crossfade_duration", "0:10") + final_mix_target_dbfs = settings.get("final_mix_target_dbfs", -1.0) + num_cores = settings.get("num_cores", 0) + + logger = logging.getLogger(__name__) + manager = Manager() + tempo_cache = manager.dict(load_tempo_cache()) + + # --- Processing Phase --- + first_result = process_song(song_configs[0], 0, tempo_cache, settings, None) + if first_result[0] is None: sys.exit(1) + + current_chain_tempo = first_result[6] + sample_rate = first_result[1] + + processed_configs = [first_result] + + for i, config in enumerate(song_configs[1:], 1): + no_adjust = config.get("no_tempo_adjust", False) + ref_tempo = current_chain_tempo if not no_adjust else None + + result = process_song(config, i, tempo_cache, settings, ref_tempo, sample_rate) + processed_configs.append(result) + + if result[6] is not None: + current_chain_tempo = result[6] + + # --- Mixing Phase --- + temp_files = [res[0] for res in processed_configs] + if any(t is None for t in temp_files): sys.exit(1) + + current_mix = AudioSegment.from_file(temp_files[0]) + chapters = [(0, os.path.basename(song_configs[0]['song_path']))] + song_start_times = [0] + + for index, config in enumerate(tqdm(song_configs[1:], desc="Mixing songs", unit="song"), start=1): + prev_song_config = song_configs[index-1] + prev_result = processed_configs[index-1] + + prev_song_orig_tempo = prev_result[2] + prev_song_ramps = prev_result[7] # Normalized ramps + + if index == 1: + prev_effective_start_tempo = None + else: + p_prev_res = processed_configs[index-2] + p_prev_no_adj = prev_song_config.get("no_tempo_adjust", False) + if p_prev_no_adj: + prev_effective_start_tempo = None + else: + prev_effective_start_tempo = p_prev_res[6] + + crossfade_start_str = config.get("crossfade_start") + crossfade_duration = parse_time(config.get("crossfade_duration", default_crossfade)) + prev_song_start_offset = parse_time(prev_song_config.get("start_offset", "0:00")) + + relative_crossfade_start = parse_time(crossfade_start_str) + + original_pos_in_trimmed = max(0, relative_crossfade_start - prev_song_start_offset) / 1000.0 + + adj_pos_sec = compute_mapped_time( + original_pos_in_trimmed, + prev_song_ramps, + prev_song_orig_tempo, + prev_effective_start_tempo, + prev_result[3] / 1000.0 + ) + + adj_crossfade_in_segment = int(adj_pos_sec * 1000) + next_song_start_time = song_start_times[-1] + adj_crossfade_in_segment + next_song_start_time = max(0, next_song_start_time) + + next_song = AudioSegment.from_file(temp_files[index]) + + fade_in_duration = parse_time(config.get("fade_in_duration")) if config.get("fade_in_duration") else crossfade_duration + fade_out_power = float(prev_song_config.get("fade_out_power", prev_song_config.get("fade_power", 1.0))) + fade_in_power = float(config.get("fade_in_power", config.get("fade_power", 1.0))) + fade_out_delay = parse_time(prev_song_config.get("fade_out_delay", "0:00")) + + track1_before_fade = current_mix[:next_song_start_time] + track1_total_overlap = current_mix[next_song_start_time : next_song_start_time + crossfade_duration] + actual_overlap_duration = len(track1_total_overlap) + + track1_constant_part = track1_total_overlap[:fade_out_delay] + track1_fade_part = track1_total_overlap[fade_out_delay:] + faded_out_segment = apply_custom_fade(track1_fade_part, 'out', len(track1_fade_part), fade_out_power) + faded_out_part = track1_constant_part + faded_out_segment + + track2_overlay_section = next_song[:actual_overlap_duration] + actual_fade_in_duration = min(fade_in_duration, actual_overlap_duration) + track2_fade_in_part = track2_overlay_section[:actual_fade_in_duration] + track2_after_fade_in = track2_overlay_section[actual_fade_in_duration:] + faded_in_part = apply_custom_fade(track2_fade_in_part, 'in', actual_fade_in_duration, fade_in_power) + full_track2_overlay = faded_in_part + track2_after_fade_in + + crossfade_result = faded_out_part.overlay(full_track2_overlay) + if crossfade_result.max_dBFS > -0.1: + crossfade_result = normalize_audio(crossfade_result, -0.1) + + current_mix = track1_before_fade + crossfade_result + next_song[actual_overlap_duration:] + song_start_times.append(next_song_start_time) + chapters.append((next_song_start_time, os.path.basename(config['song_path']))) + + # --- Export --- + logger.info("Exporting raw mix...") + temp_pcm = "temp_raw_mix.raw" + current_mix.export(temp_pcm, format="raw") + temp_raw_file = "temp_raw_mix.flac" + bits = current_mix.sample_width * 8 + pcm_format = f"s{bits}le" + subprocess.run(["ffmpeg", "-f", pcm_format, "-ar", str(current_mix.frame_rate), "-ac", str(current_mix.channels), "-i", temp_pcm, "-c:a", "flac", "-y", temp_raw_file], check=True, capture_output=True) + + logger.info("Normalizing...") + subprocess.run(["ffmpeg", "-i", temp_raw_file, "-af", f"loudnorm=I=-14:LRA=7:TP={final_mix_target_dbfs}", "-y", output_file], check=True, capture_output=True) + + for f in [temp_pcm, temp_raw_file] + temp_files: + if os.path.exists(f): os.remove(f) + + add_flac_chapters(output_file, chapters) + save_tempo_cache(tempo_cache.copy()) + return output_file, len(current_mix), current_chain_tempo + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--playlist", type=str, default="ambient_mix_settings.json") + parser.add_argument("--debug", action="store_true") + parser.add_argument("--test-last-two", action="store_true") + parser.add_argument("--tracks", type=str) + args = parser.parse_args() + + setup_logging(level=logging.DEBUG if args.debug else logging.INFO) + logger = logging.getLogger(__name__) + + with open(args.playlist, 'r') as f: + playlist_data = json.load(f) + + if args.tracks: + try: + track_numbers = [int(t.strip()) for t in args.tracks.split(',')] + original_tracks = playlist_data['tracks'] + playlist_data['tracks'] = [original_tracks[i-1] for i in track_numbers if 0 < i <= len(original_tracks)] + except ValueError: + logger.error("Invalid format for --tracks.") + sys.exit(1) + elif args.test_last_two: + playlist_data['tracks'] = playlist_data['tracks'][-2:] + + try: + output_file, final_duration, ref_tempo = mix_songs(playlist_data) + print(f"\nSuccess! Output: {output_file}") + except Exception as e: + logging.error(f"Error: {e}", exc_info=True) diff --git a/dj_mix_playlist.csv b/dj_mix_playlist.csv new file mode 100644 index 0000000..868174c --- /dev/null +++ b/dj_mix_playlist.csv @@ -0,0 +1,341 @@ +track_path,genre,tempo,camelot_key,category +Barker/ Utility [113541198] [2019]/07 - Barker - Utility.flac,Trance / IDM / Ambient,70.02409362792969,10A,Ambient +"Plastikman, Richie Hawtin/Artifakts (BC) [137659864] [1998]/01 - Plastikman, Richie Hawtin - Korridor.flac",Ambient Techno / Minimal Techno,96.50098419189453,4A,Ambient +Dead Can Dance/ The Serpent's Egg (Remastered) [2210769] [1988]/04 - Dead Can Dance - The Writing on My Father's Hand (Remastered).flac,Ethereal Wave / Neoclassical Darkwave,105.17031860351562,4A,Ambient +Like weather (2020 remaster) [WEB FLAC]/03 Leila - Underwaters (One for Keni).flac,IDM / Ambient,113.99656677246094,,Ambient +Andy Stott/ Faith in Strangers [176029639] [2014]/01 - Andy Stott - Time Away.flac,Ambient / Deconstructed Club,114.11782836914062,7B,Ambient +Ben Buitendijk - Transcended Being EP (2017) [48521112]/02. Ben Buitendijk - Blank Metal.flac,Ambient Techno,116.9906005859375,10A,Ambient +Dark Sky/ Othona [199635044] [2017]/02 - Dark Sky - Domes.flac,Ambient / Electronic,119.95415496826172,,Ambient +Four Tet/Pink [79549403] [2012]/07 - Four Tet - Peace for Earth.flac,Ambient / Downtempo,120.70010375976562,,Ambient +Linkwood/ Expressions [126108159] [2015]/12 - Linkwood - Love Lost.flac,Ambient / Deep House,122.46846008300781,9B,Ambient +Dead Can Dance/ The Serpent's Egg (Remastered) [2210769] [1988]/01 - Dead Can Dance - The Host of Seraphim (Remastered).flac,Ethereal Wave / Neoclassical Darkwave,122.8890151977539,4A,Ambient +Evigt Mörker/ Drömsyn [403208144] [2016]/01 - Evigt Mörker - Drömsyn.flac,Ambient Techno,123.93344116210938,4A,Ambient +Dark Sky/ Othona [199635044] [2017]/08 - Dark Sky - The Walker.flac,Ambient / Electronic,131.04214477539062,8A,Ambient +Twin Peaks/ Soundtrack From Twin Peaks [4625718] [1990]/01 - Twin Peaks Soundtrack - Twin Peaks Theme (Instrumental).flac,Ambient / Jazz,143.49388122558594,7B,Ambient +"Conrad Schnitzler, Pole/ Con-Struct [88150247] [2017]/06 - Conrad Schnitzler, Pole - Wiegenlied für Katzen.flac",Ambient / Experimental,78.26022339,10B,Ambient +Prins Thomas/Paradise Goulash [188131511] [2015]/43 - Stefan Vincent - Fool Me Again.flac,Techno,129.83639526367188,4A,Main +Casino versus Japan/ Go Hawaii [56559140] [1999]/06 - Casino versus Japan - Dielectric Saints.flac,IDM / Ambient,178.20596313476562,7B,Ambient +Seekae/ +Dome [336407937] [2011]/04 - Seekae - Reset Head.flac,Post-Dubstep / IDM,70.03629302978516,6A,Main +Burial/ Burial [53834442] [2006]/08 - Burial - Gutted.flac,Future Garage / Dubstep,71.3104248046875,,Main +Bicep/Bicep [75160673] [2017]/10 - Bicep - Ayr.flac,Breaks / Ambient,161.50001525878906,5A,Main +Nightmares on Wax/ Smokers Delight [16024766] [1995]/05 - Nightmares on Wax - Stars.flac,Downtempo / Trip-Hop,156.5277557373047,11B,Main +Nightmares on Wax/ Smokers Delight [16024766] [1995]/03 - Nightmares on Wax - Pipes Honour.flac,Downtempo / Trip-Hop,156.55911254882812,,Main +Leon Vynehall/ Music for the Uninvited [168277757] [2014]/06 - Leon Vynehall - Christ Air.flac,Deep House,76.15439606,9B,Main +Modeselektor/ Monkeytown [199583149] [2011]/01 - Modeselektor - Blue Clouds.flac,IDM / Hip Hop,78.00963592529297,8B,Main +"Modeselektor/ Monkeytown [199583149] [2011]/03 - Modeselektor, Thom Yorke - Shipwreck.flac",IDM / Electronic,78.0157241821289,9A,Main +Machinedrum/ Vapor City Archives [36162311] [2014]/03 - Machinedrum - Hard 2 Be.flac,Footwork / Juke / UK Bass,80.02485656738281,10B,Main +Machinedrum/[A] Vapor City [21736061] [2013]/03 - Machinedrum - Don’t 1 2 Lose U.flac,Footwork / UK Bass,81.97791290283203,6A,Main +"Burial/ Burial [53834442] [2006]/03 - Burial, Spaceape - Spaceape.flac",Future Garage / Dubstep,84.01387786865234,8B,Main +Machinedrum/[A] Vapor City [21736061] [2013]/01 - Machinedrum - Gunshotta.flac,Footwork / Drum and Bass,85.05208587646484,9A,Main +Art Of Noise/[M] The Ambient Collection [46952148] [1990]/06 - Art Of Noise - Camilla (Remixed by Youth).flac,Ambient,85.25466918945312,9A,Main +Casino versus Japan/ Go Hawaii [56559140] [1999]/02 - Casino versus Japan - It's Very Sunny.flac,IDM / Ambient,85.58793640136719,6A,Main +"Molina, Late Verlane/ Hey Kids [117497586] [2018]/01 - Molina - Hey Kids.flac",Indie Pop / Electronic,86.95806884765625,9A,Main +Gold Panda/ Companion [21583086] [2011]/02 - Gold Panda - Fifth Ave.flac,Chillwave / Folktronica,88.19422149658203,8B,Main +Andy Stott/ Too Many Voices [70320988] [2016]/04 - Andy Stott - First Night.flac,Deconstructed Club / Electronic,89.92286682128906,10A,Main +Vanilla/ Origin [199611226] [2015]/08 - Vanilla - Summer.flac,Chillhop / Instrumental Hip Hop,90.95537567138672,10B,Main +Sahy Uhns/ An Intolerant Disdain of Underlings [404562737] [2011]/01 - Sahy Uhns - Montebello Postpartum.flac,IDM / Glitch,91.96073150634766,4A,Main +Nightmares on Wax/ Smokers Delight [16024766] [1995]/16 - Nightmares on Wax - Gambia Via Vagator Beach.flac,Downtempo / Trip-Hop,92.97482299804688,5A,Main +Jan Hammer/ Escape From Television [3393242] [1987]/01 - Jan Hammer - Crockett's Theme (From -Miami Vice II- Soundtrack).flac,Synth-pop / New Wave,95.67214965820312,7B,Main +Various Artists/[M] Vienna Scientists [13304708] [1998]/05 - Mama Oliver - East West (Stoned Together).flac,Downtempo / Trip-Hop,96.91780853271484,11A,Main +Party Tyme/ Hip Hop & Rap Hits 4 - Party Tyme (Backing Version [314894742] [2023]/CD1/12 - Party Tyme - Zeze (made popular by Kodak Black ft. Travis Scott.flac,Trap,97.96430969238281,,Main +Dabrye/ One - Three [21681300] [2001]/03 - Dabrye - With A Professional.flac,Glitch Hop / Instrumental Hip Hop,97.99185180664062,3B,Main +Rival Consoles/Odyssey - Sonne [103317709] [2015]/08 - Rival Consoles - Haunt.flac,IDM / Ambient Techno,98.20332336425781,6A,Main +Andy Stott/ Too Many Voices [70320988] [2016]/03 - Andy Stott - New Romantic.flac,Deconstructed Club / Electronic,99.90301513671875,5A,Main +Modeselektor/ Monkeytown [199583149] [2011]/07 - Modeselektor - Grillwalker.flac,Techno,100.01006317138672,9A,Main +Plaid/ The Digging Remedy [106693880] [2016]/01 - Plaid - Do Matter.flac,IDM / Electronic,100.04009246826172,,Main +"Plastikman, Richie Hawtin/Artifakts (BC) [137659864] [1998]/03 - Plastikman, Richie Hawtin - Pakard.flac",Minimal Techno,100.0936050415039,4A,Main +Rival Consoles/Odyssey - Sonne [103317709] [2015]/01 - Rival Consoles - Odyssey.flac,IDM / Ambient Techno,100.96162414550781,8A,Main +Nightmares on Wax/ Smokers Delight [16024766] [1995]/13 - Nightmares on Wax - What I'm Feelin (Good).flac,Downtempo / Trip-Hop,100.9806137084961,7B,Main +Modeselektor/ Hello Mom! [87377976] [2005]/03 - Modeselektor - Tetrispack.flac,IDM / Electro,103.00035858154297,6A,Main +"The History Of Trance/ The History of Trance '91-'96, Vol. 1 [392650168] [1996]/04 - The History Of Trance - Contrex Ville.flac",Acid Trance,103.90945434570312,6A,Main +/home/someone/muziek/11 - The Field - No. No... (John Tejada Mix).flac,Tech House / Minimal Techno,109.00038146972656,7A,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/12 - Len Leise - Dance Of The Ghosts.flac,Balearic,109.2009506225586,7B,Main +Andy Stott/ It Should Be Us [176030209] [2019]/04 - Andy Stott - It Should Be Us.flac,Techno / Deconstructed Club,109.56950378417969,5A,Main +Rival Consoles/Odyssey - Sonne [103317709] [2015]/03 - Rival Consoles - Voyager.flac,IDM / Ambient Techno,109.8339614868164,8A,Main +Andy Stott/ Faith in Strangers [176029639] [2014]/06 - Andy Stott - How It Was.flac,Deconstructed Club / Dub Techno,110.00064086914062,,Main +Autechre/Incunabula [16024878] [1993]/06 - Autechre - Eggshell.flac,IDM / Ambient Techno,110.01618194580078,7B,Main +Manuel Göttsching/ E2-E4 [198347885] [1981]/02 - Manuel Göttsching - E2-E4 Ruhige Nervosität 2.flac,Berlin School / Proto-Techno,110.31440734863281,12A,Main +Daniel Avery/Drone Logic [43421119] [2013]/04 - Daniel Avery - These Nights Never End.flac,Techno,111.56741333007812,7A,Main +David August/Diynamic Revisited (By David August) [33582870] [2014]/01 - Kollektiv Turmstrasse - Last Day (David August Revision).flac,Deep House,112.0049057006836,,Main +David August/Diynamic Revisited (By David August) [33582870] [2014]/02 - Stimming - Der Schmelz (David August Revision).flac,Deep House,112.50990295410156,5A,Main +Jean-Michel Jarre/[M] Les concerts en Chine 1981 [335743654] [2015]/02 - Jean-Michel Jarre - Arpegiateur (Live in China).flac,Electronic / Berlin School,114.70527648925781,5A,Main +Burial/ Street Halo [53833720] [2011]/03 - Burial - Stolen Dog.flac,Future Garage,115.63007354736328,12A,Main +"Burial, Four Tet/ Nova - Moth [214180270] [2022]/02 - Burial, Four Tet - Moth.flac",Future Garage / Microhouse,117.50379943847656,10B,Main +Norken/ Southern Soul [72533535] [2017]/01 - Norken - Southern Soul.flac,Deep House,117.79279327392578,10A,Main +Norken/ Southern Soul [72533535] [2017]/01 - Norken - Southern Soul.flac,Deep House,117.79279327392578,10A,Main +David August/ Epikur EP [163672968] [2014]/01 - David August - Epikur (Original).flac,Deep House,117.8792495727539,4A,Main +Marco Bernardi/ Motorways [283557486] [2013]/01 - Marco Bernardi - Motorways.flac,Techno,117.97688293457031,12A,Main +Marco Bernardi/ Motorways [283557486] [2013]/01 - Marco Bernardi - Motorways.flac,Techno,117.97688293457031,12A,Main +Daniel Avery/Drone Logic [43421119] [2013]/08 - Daniel Avery - All I Need.flac,Techno / House,117.98904418945312,6A,Main +"Prins Thomas/Paradise Goulash [188131511] [2015]/18 - Donato Dozzy & Tin Man, Tin Man - Test 7.flac",Acid Techno,118.00253295898438,4A,Main +Bicep/Bicep [75160673] [2017]/06 - Bicep - Spring.flac,Breaks / UK Bass,118.00274658203125,5A,Main +"/home/someone/muziek/09 - Vermont, Dixon - Dschuna (Dixon Mix).flac",Deep House,118.00762939453125,4A,Main +/home/someone/muziek/09 - Jürgen Paape - Manipuri.flac,Microhouse / Pop Ambient,118.31008911132812,9A,Main +"Bicep/Isles [157751887] [2021]/06 - Bicep, Clara La San - X.flac",Breaks / UK Bass,118.33991241455078,,Main +Machinedrum/ Room(s) [230172871] [2011]/10 - Machinedrum - Door(s).flac,Footwork / Juke / UK Bass,76.97500610351562,,Main +Pedestrian/ Pick Your Shots Clean [243104328] [2016]/01 - Pedestrian - Pick Your Shots Clean.flac,Deep House / UK Bass,118.663330078125,7A,Main +Pedestrian/ Pick Your Shots Clean [243104328] [2016]/01 - Pedestrian - Pick Your Shots Clean.flac,Deep House / UK Bass,118.663330078125,7A,Main +Bonobo/[A] The North Borders [19084868] [2013]/03 - Bonobo - Cirrus.flac,Downtempo / Electronic,118.96809387207031,7A,Main +Manikěizt - 2018 - Disco Futurista/14 - MTRLV - Whatever We Go Through.flac,House / Disco,119.00023651123047,9A,Main +Baltra/ No Regrets [95913420] [2017]/02 - Baltra - Fuck All Y’all Haters.flac,Lo-Fi House,119.00711059570312,7A,Main +"Plastikman, Richie Hawtin/Artifakts (BC) [137659864] [1998]/02 - Plastikman, Richie Hawtin - Psyk.flac",Minimal Techno / Ambient Techno,119.46066284179688,4A,Main +Leon Vynehall/ Music for the Uninvited [168277757] [2014]/01 - Leon Vynehall - Inside the Deku Tree.flac,Deep House,119.66380310058594,11A,Main +Andy Stott/ Merciless [176028467] [2006]/01 - Andy Stott - Florence.flac,Dub Techno,119.91050720214844,6A,Main +Daniel Avery/Drone Logic [43421119] [2013]/01 - Daniel Avery - Water Jump (Album Version).flac,Techno / Acid House,119.96485900878906,8A,Main +Rone/ Spanish Breakfast [6304551] [2009]/08 - Rone - Tasty City.flac,IDM / Techno,119.97761535644531,10A,Main +DJ Boring/ Sunday Avenue [284620418] [2017]/01 - DJ Boring - Sunday Avenue.flac,Lo-Fi House,119.97834777832031,6A,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/21 - Forever Sound - Glowworm.flac,Deep House,119.97863006591797,8A,Main +Kiasmos/Kiasmos [103318515] [2014]/03 - Kiasmos - Looped.flac,Minimal Techno / Ambient,119.9796142578125,6A,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/22 - Odd Numbers - Riviera.flac,House,119.98377990722656,8A,Main +Various Artists/VA - Electronic Music Anthology (by FG) (2018) [FLAC]/47. Frankey and Sandrino - Acamar.flac,Deep House / Melodic House & Techno,119.98524475097656,8A,Main +Coastdream/ Soft Moon [96721340] [2017]/01 - Coastdream - Soft Moon.flac,Lo-Fi House,119.99015808105469,5A,Main +Laurence Guy/ Saw You for the First Time [307534484] [2017]/10 - Laurence Guy - W.L.Y.B.flac,Deep House,119.99136352539062,,Main +Coastdream/ Shine [100193746] [2018]/03 - Coastdream - 2k7.flac,Lo-Fi House,119.99568176269531,7A,Main +/home/someone/muziek/02 - Coma - Atlantis.flac,Tech House / Pop Ambient,119.99854278564453,6A,Main +Leon Vynehall/ Butterflies - This is the Place [68135678] [2014]/01 - Leon Vynehall - Butterflies.flac,Deep House,120.00247192382812,5A,Main +Coastdream/ Shine [100193746] [2018]/01 - Coastdream - Shine (Euro Mix).flac,Lo-Fi House,120.00251770019531,12B,Main +Kiasmos/Blurred [103386930] [2017]/03 - Kiasmos - Jarred.flac,Minimal Techno / Ambient,120.0053482055664,5A,Main +Groove Armada/[M] Groove Armada Greatest Hits [1189539] [2007]/08 - Groove Armada - Chicago.flac,House,120.00834655761719,,Main +Daniel Klauser/ Always I'm Back Here [67894299] [2015]/03 - Daniel Klauser - Always I'm Back Here.flac,House,120.01665496826172,8A,Main +"Andy Stott/ Never The Right Time [176296284] [2021]/02 - Andy Stott, Alison Skidmore - Never the right time.flac",Deconstructed Club / Trip-Hop,120.02083587646484,5A,Main +Robag Wruhme/ Olgamikks [16676895] [2012]/05 - Kollektiv Turmstrasse - Heimat (Robags Turmkolle Rekksmow).flac,Microhouse / Minimal Techno,120.03728485107422,10A,Main +Gavinco/ Funkula [310361510] [2023]/01 - Gavinco - Funkula.flac,House,120.05329132080078,5A,Main +Monolake/ Gravity [31532897] [2001]/01 - Monolake - Mobile.flac,Dub Techno / Minimal Techno,120.5144271850586,7A,Main +Aleksandir/Yamaha [90897198] [2018]/01 - Aleksandir - Yamaha.flac,Lo-Fi House,120.90277862548828,5A,Main +"Laurence Guy/ Saw You for the First Time [307534484] [2017]/05 - Laurence Guy, Ishmael - Anchor.flac",Deep House,120.94184875488281,11A,Main +Stephan Bodzin/ Powers of Ten [45241387] [2015]/01 - Stephan Bodzin - Singularity.flac,Melodic Techno,120.9670181274414,,Main +Laurence Guy/ Saw You for the First Time [307534484] [2017]/06 - Laurence Guy - Saw You for the First Time.flac,Deep House,120.98542022705078,4A,Main +/home/someone/muziek/05 - Matias Aguayo - Komm.flac,Microhouse / Minimal Techno,120.99076843261719,,Main +Leon Vynehall/ Music for the Uninvited [168277757] [2014]/05 - Leon Vynehall - It's Just (House of Dupree).flac,Deep House,121.30806732177734,4A,Main +so. mind/ Born to Live [106929042] [2019]/02 - so. mind - Callin for Ya.flac,Lo-Fi House / Deep House,121.97224426269531,,Main +"Prins Thomas/Paradise Goulash [188131511] [2015]/25 - Joachim Holm & Alejandro Mosso, Alejandro Mosso - Tre Melodi.flac",Minimal Techno,121.99746704101562,12A,Main +/home/someone/muziek/10 - Dave DK - Smukke Lyde.flac,Deep House / Tech House,121.99961853027344,5A,Main +SLIM HUSTLA - Turnstile Jumps EP/SLIM HUSTLA - Turnstile Jumps EP - 05 Codeine Cups (Ft. DJ ÆDIDIAS).flac,Lo-Fi House,122.00263214111328,11A,Main +Kiasmos/Blurred [103386930] [2017]/02 - Kiasmos - Blurred.flac,Minimal Techno / Ambient,122.0286865234375,12B,Main +Various Artists/ HDC003 [352797419] [2016]/02 - Baltra - Tears Drop.flac,Lo-Fi House,122.02957916259766,12A,Main +Laurence Guy/ Les Mur [147799811] [2015]/01 - Laurence Guy - Les Mur.flac,Deep House,122.03390502929688,10A,Main +so. mind/ Born to Live [106929042] [2019]/03 - so. mind - Good Conditions.flac,Lo-Fi House / Deep House,122.53311157226562,,Main +"Beatport Top 100 Deep House May 2025/A-Trak, Kapote, Sam Ruffillo - La La Tune (A-Trak Remix Extended Version).flac",House / Disco House,122.9247817993164,5A,Main +Robag Wruhme/ Olgamikks [16676895] [2012]/10 - Extrawelt - Neuland (Robags Rexmow 001).flac,Microhouse / Minimal Techno,122.95919036865234,12A,Main +Joseph Ray/ 300 Below - EP [182675724] [2021]/01 - Joseph Ray - 300 Below.flac,Melodic House & Techno,122.95954132080078,,Main +Various Artists/Various - Step Back Trax 003 [SBT003] [2018]/04. Slim Hustla - Remain Unseen.flac,Lo-Fi House,122.9631576538086,7B,Main +Bicep/Bicep [75160673] [2017]/12 - Bicep - Aura.flac,Breaks / Trance,122.975341796875,,Main +Marcu Rares/ Soul Bonding [175595586] [2021]/04 - Marcu Rares - Forever After.flac,Minimal / Deep Tech,122.98562622070312,5A,Main +Claude Vonstroke/ Urban Animal [312337277] [2013]/09 - Claude Vonstroke - Can't Wait.flac,Tech House,122.98572540283203,9A,Main +/home/someone/muziek/08 - Gui Boratto - 22.flac,Progressive House / Tech House,122.98978424072266,,Main +/home/someone/muziek/09 - Raxon - Dark Light.flac,Melodic House & Techno,122.99674987792969,,Main +Bicep/Bicep [75160673] [2017]/01 - Bicep - Orca.flac,Breaks / UK Bass,122.99825286865234,10A,Main +Baltra/ No Regrets [95913420] [2017]/03 - Baltra - No Regrets.flac,Lo-Fi House,122.9984359741211,1B,Main +NiNO/ Odysseia EP [66638063] [2016]/02 - NiNO - Odysseia (Original Mix).flac,Tech House,122.99845123291016,9A,Main +Yatoba Lia/ Moi Aussi Marianne [172522828] [2021]/01 - Yatoba Lia - Moi Aussi Marianne.flac,Deep House,123.00215148925781,10A,Main +Honey Dijon/ DJ-Kicks- Honey Dijon [381057642] [2024]/CD2/15 - Art Of Tones - Praise.flac,House,123.00961303710938,7A,Main +(1993) Far East Recording [FER06858]/10 - Soichi Terada; Shinichiro Yokota - Tokyo XXX.flac,House,123.06609344482422,,Main +Leon Vynehall/ Music for the Uninvited [168277757] [2014]/02 - Leon Vynehall - Goodthing.flac,Deep House,123.33172607421875,2B,Main +geods sorèd/ Findings [279217889] [2023]/02 - geods sorèd - Don't Make Me Wait.flac,Deep House,123.50894165039062,,Main +Orbital/[M] Orbital 2 [82530740] [1993]/09 - Orbital - Halcyon and On and On.flac,Ambient House / Trance,126.92256164550781,12B,Main +Pachanga Boys/ Girlcatcher [78444961] [2012]/03 - Pachanga Boys - Time.flac,Deep House / Tech House,123.79177856445312,7B,Main +Gui Boratto/ The K2 Chapter [154863821] [2013]/01 - Gui Boratto - Arquipelago.flac,Tech House / Progressive House,123.8010025024414,,Main +Floating Points/ Shadows [251631952] [2011]/05 - Floating Points - Sais.flac,Deep House / Broken Beat,135.32374572753906,5A,Main +Raär/ Sometimes I Hear Sirens [162531593] [2015]/01 - Raär - Sometimes I Hear Sirens.flac,Lo-Fi Techno,123.81367492675781,4A,Main +Autechre/Incunabula [16024878] [1993]/05 - Autechre - Basscadet.flac,IDM / Techno,123.87831115722656,8A,Main +"yungpolar/ Lofi House Tape, Vol. 1 [271715763] [2023]/08 - yungpolar - Last Station.flac",Lo-Fi House,123.90953063964844,8A,Main +"yungpolar/ Lofi House Tape, Vol. 1 [271715763] [2023]/06 - yungpolar - Maybe It's Love---.flac",Lo-Fi House,123.918701171875,8A,Main +Stephan Bodzin/ Powers of Ten [45241387] [2015]/10 - Stephan Bodzin - Wir.flac,Melodic Techno,123.92633056640625,7A,Main +Baltra/ Fade Away (Vocal) [182615002] [2016]/01 - Baltra - Fade Away (Vocal).flac,Lo-Fi House,123.95465850830078,8A,Main +Various Artists/ Various Adepts- Volume IV [125526399] [2019]/01 - Primal Code - Moth.flac,Techno,123.97295379638672,4A,Main +Daso/Daso - 2007 - Absinthe EP [FLAC]/03 La Fée Verte.flac,Minimal Techno / Tech House,123.98363494873047,7A,Main +Kiasmos/Blurred [103386930] [2017]/04 - Kiasmos - Paused.flac,Minimal Techno / Ambient,123.98764038085938,11A,Main +Palms Trax/ Equation [60783245] [2013]/02 - Palms Trax - Equation.flac,Deep House,123.9992904663086,6A,Main +Claude Vonstroke/ Urban Animal [312337277] [2013]/03 - Claude Vonstroke - Dood.flac,Tech House,124.00584411621094,12A,Main +Various Artists/ Grand Cru 2008 [18274893] [2008]/06 - Daso - Booker (Original Mix).flac,Tech House,124.01505279541016,10A,Main +Ross from Friends/ You'll Understand [69281351] [2017]/01 - Ross from Friends - Talk To Me You'll Understand.flac,Lo-Fi House,124.01791381835938,12A,Main +Ross from Friends/ You'll Understand [69281351] [2017]/01 - Ross from Friends - Talk To Me You'll Understand.flac,Lo-Fi House,124.01791381835938,12A,Main +John Tejada/ Signs Under Test [39791796] [2015]/07 - John Tejada - Rubric.flac,Tech House,124.33545684814453,8A,Main +micronism/ inside a quiet mind [247257350] [1998]/08 - micronism - engaging causeless mercy.flac,Deep House / Ambient Techno,124.87757873535156,9A,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/35 - Louis Haiman - Ghosts Of Gratiot.flac,Deep House / Dub Techno,124.9041748046875,5A,Main +Shortcut/ Hope [219777058] [2022]/01 - Shortcut - Hope.flac,House,124.94646453857422,7A,Main +808 State/ In Yer Face Bicep Remixes [282358986] [2016]/01 - 808 State - In Yer Face (Bicep Remix).flac,Techno / House,124.94929504394531,8A,Main +Robag Wruhme/ Olgamikks [16676895] [2012]/09 - Gui Boratto - No Turning Back (Robags Likkalize Love Remix).flac,Microhouse / Minimal Techno,124.95291137695312,7B,Main +Floating Points/Ratio [251648888] [2017]/01 - Floating Points - Ratio (Full Mix).flac,Acid Techno,124.96118927001953,,Main +/home/someone/muziek/04 - ANNA - Hidden Beauties.flac,Techno,124.96752166748047,4A,Main +Various Artists/ Grand Cru 2008 [18274893] [2008]/10 - Kollektiv Turmstrasse - Lüchttoorn (Original Mix).flac,Minimal Techno,124.97062683105469,,Main +AljoMen/ Cherrrybomb [255167405] [2022]/01 - AljoMen - Cherrrybomb.flac,House,124.97331237792969,5A,Main +John Tejada/ Signs Under Test [39791796] [2015]/06 - John Tejada - Cryptochrome.flac,Tech House,124.97714233398438,4A,Main +"Bicep/Isles [157751887] [2021]/07 - Bicep, Julia Kent - Rever.flac",Breaks / Ambient,124.9795150756836,5A,Main +John Tejada/ Signs Under Test [39791796] [2015]/03 - John Tejada - Beacht.flac,Tech House,124.98284149169922,7B,Main +Folamour - Naarm's Sunset/Folamour - Naarm's Sunset (Extended Version).aiff,House / Disco House,124.98799896240234,8A,Main +Mark Laird/ Funk That [84287225] [2018]/01 - Mark Laird - Funk That (Original mix).flac,House / Bass House,124.9882583618164,,Main +Mark Laird/ Funk That [84287225] [2018]/02 - Mark Laird - Crazy Things (Original mix).flac,House / Bass House,124.98883819580078,5A,Main +"Silicone Soul-The Answer-WEB-FLAC-2000/03. Silicone Soul - Right on, Right On (Original Instrumental).flac",Deep House,124.98915100097656,,Main +Sascha Funke/ Mango [87379506] [2008]/01 - Sascha Funke - Mango.flac,Minimal Techno / Tech House,124.9942626953125,5A,Main +Sascha Funke/ Mango [87379506] [2008]/01 - Sascha Funke - Mango.flac,Minimal Techno / Tech House,124.9942626953125,5A,Main +Leon Vynehall/ Music for the Uninvited [168277757] [2014]/04 - Leon Vynehall - Pier Children.flac,Deep House,124.9962387084961,10A,Main +Paranoid London/[E] Paranoid London [82666895] [2018]/11 - Paranoid London - Eating Glue (Instrumental).flac,Acid House,124.99907684326172,11B,Main +Audion/ Mouth to Mouth [151255637] [2006]/01 - Audion - Mouth to Mouth.flac,Minimal Techno / Tech House,125.00029754638672,,Main +Extrawelt/ Schöne Neue Extrawelt [63313618] [2008]/12 - Extrawelt - Homing.flac,Techno / Minimal Techno,125.00592041015625,6A,Main +Linkwood/ Expressions [126108159] [2015]/09 - Linkwood - Expressions.flac,Deep House,125.00676727294922,8A,Main +Stephan Bodzin/ Powers of Ten [45241387] [2015]/02 - Stephan Bodzin - IX.flac,Melodic Techno,125.00922393798828,5A,Main +Agoria - 2007 - Les Violons Ivres EP/01 Agoria - Les Violons Ivres (Super Remix).flac,Tech House,125.00953674316406,7B,Main +Mall Grab/ 2015 - 2017 [268521056] [2023]/05 - Mall Grab - I've Always Liked Grime.flac,Lo-Fi House,125.01271057128906,7A,Main +Bicep/Just EP [184785872] [2015]/02 - Bicep - Celeste.flac,Breaks / House,125.01766967773438,7A,Main +Booka Shade/ Movements [212830133] [2006]/10 - Booka Shade - In White Rooms.flac,Tech House,125.01844787597656,5A,Main +"Beatport Top 100 Deep House May 2025/Chris Stussy, S.A.M. - Breather (Original Mix).flac",Deep House,125.0193862915039,8A,Main +"Paranoid London/[E] Paranoid London [82666895] [2018]/01 - Paranoid London, Mutado Pintado - Light Tunnel.flac",Acid House,125.0213851928711,3B,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/36 - Evigt Mörker - Högre.flac,Techno,125.02205657958984,4A,Main +Bicep/ Circles EP [364842690] [2014]/02 - Bicep - NRG106.flac,Techno / House,125.02267456054688,12A,Main +Daso/Daso - 2007 - Absinthe EP [FLAC]/02 Louche.flac,Minimal Techno / Tech House,125.02801513671875,7A,Main +Floating Points/ Shadows [251631952] [2011]/04 - Floating Points - ARP3.flac,Deep House / Broken Beat,125.0283203125,4A,Main +Daso/Meine Idee [151253289] [2007]/01 - Daso - Meine.flac,Minimal Techno / Tech House,125.95564270019531,11A,Main +Mr.Brown/ Blau [333179949] [2022]/01 - Mr.Brown - Blau.flac,Deep House,125.95970916748047,,Main +Various Artists/VA - Electronic Music Anthology (by FG) (2018) [FLAC]/40. Oxia - Domino (Rework Edit).flac,Techno,125.98706817626953,,Main +Various Artists/ Naba VA 002 [103500941] [2019]/01 - Primal Code - Alhambra (Original Mix).flac,Techno,125.99022674560547,6A,Main +Extrawelt/ Schöne Neue Extrawelt [63313618] [2008]/04 - Extrawelt - Messy Machinery.flac,Techno / Minimal Techno,125.99393463134766,10A,Main +Daso/Go Upstairs [87607257] [2006]/01 - Daso - Go Upstairs.flac,Minimal Techno / Tech House,126.00054168701172,4A,Main +"Artmann/A1_July'z,_Artmann_Phenomenal01_VINYL_ONLY_July'z.aiff",Minimal / Deep Tech,126.00304412841797,,Main +Daso/Daso - 2007 - Absinthe EP [FLAC]/01 Thujon.flac,Minimal Techno / Tech House,126.0052261352539,7A,Main +Baltra/ No Regrets [95913420] [2017]/04 - Baltra - Soul 4 Real (Vocal Mix).flac,Lo-Fi House,126.00614929199219,,Main +Daphni/ Joli Mai [79527240] [2017]/06 - Daphni - Vikram.flac,House / Tech House,126.03064727783203,9A,Main +dominica - gotta let you go (2015 edit) - promo/02 - Gotta Let You Go (2015 Edit).flac,House,126.35246276855469,1B,Main +Space/ The Best Of Space [95014591] [2018]/01 - Space - Magic Fly.flac,Disco / Space Disco,126.46379852294922,8A,Main +Space/ The Best Of Space [95014591] [2018]/01 - Space - Magic Fly.flac,Disco / Space Disco,126.46379852294922,8A,Main +Andy Stott/ Faith in Strangers [176029639] [2014]/08 - Andy Stott - Faith in Strangers.flac,Deconstructed Club / Ambient,136.911865234375,8B,Main +Monolake/ Momentum [31300339] [2003]/02 - Monolake - Linear.flac,Dub Techno / Minimal Techno,126.82186126708984,11A,Main +Four Tet/New Energy [79358620] [2017]/14 - Four Tet - Planet.flac,House / Electronic,126.93342590332031,7A,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/20 - Hieroglyphic Being - Imaginary Soundscapes 9.flac,Experimental / Acid House,126.94746398925781,,Main +Robag Wruhme/ Olgamikks [16676895] [2012]/03 - Fenin - None of Them (Robags Berfa Lubb Dubbse).flac,Microhouse / Minimal Techno,126.96561431884766,9A,Main +"Artmann/A2_July'z,_Artmann_Phenomenal02_VINYL_ONLY_July'z.aiff",Minimal / Deep Tech,126.9784164428711,7A,Main +Catlow/ Coming to See You - EP [380269511] [2024]/04 - Catlow - Looking Back.flac,Deep House,126.99139404296875,10A,Main +Rone/ Spanish Breakfast [6304551] [2009]/03 - Rone - Belleville.flac,IDM / Techno,127.00289916992188,,Main +Various Artists/VA - Electronic Music Anthology (by FG) (2018) [FLAC]/14. Soha - Eve.flac,House,127.00386810302734,12A,Main +Merv - Re-Melted (FLAC)/A - Dust.flac,Techno,131.15802001953125,2B,Main +John Tejada/ Parabolas [154466396] [2011]/01 - John Tejada - Farther And Fainter.flac,Tech House,127.01416778564453,,Main +Four Tet/Pink [79549403] [2012]/02 - Four Tet - Lion.flac,Microhouse / UK Funky,127.03502655029297,,Main +Modeselektor/ Monkeytown [199583149] [2011]/05 - Modeselektor - German Clap.flac,Techno / Electro,127.9735336303711,10A,Main +Various Artists/ 15 Years Fuse [158929553] [2009]/05 - Second-Hand Satellites - Orbit 1.4.flac,Deep House / Dub Techno,127.97834014892578,,Main +"Jesse Bru, Harrison BDP/ Happiness Therapy Split, Vol. 2 [186396321] [2018]/04 - Harrison BDP - Parallax.flac",Deep House,127.98197174072266,,Main +Beatport Top 100 Deep House May 2025/M-High - Soulseeker (Original Mix).flac,Deep House,127.99237060546875,,Main +"Artmann/Yogi P, Artmann - Check This Feelin' (PM Mix).aiff",Minimal / Deep Tech,127.99882507324219,6A,Main +Alex Dolby/ Multiple Faces Ep [69040645] [2017]/03 - Alex Dolby - Sintesi (Original mix).flac,Techno,128.01943969726562,12B,Main +"/home/someone/muziek/18 - Danny Daze, Shokh - Aire.flac",Electro / Techno,128.02011108398438,7A,Main +Extrawelt/ Schöne Neue Extrawelt [63313618] [2008]/03 - Extrawelt - Wippsteert.flac,Techno / Minimal Techno,128.02931213378906,11A,Main +Prins Thomas/Paradise Goulash [188131511] [2015]/26 - Robert Hood - Drive (The Age Of Automation).flac,Techno,128.03973388671875,9A,Main +Artmann/ARTMANN - Blockparty Host [OVRDOSE DEEP].aiff,Minimal / Deep Tech,128.04913330078125,,Main +Roy of the Ravers/2 Late 4 Love [283558071] [2020]/02 - Roy of the Ravers - Emotinium.flac,Acid Techno,128.23374938964844,3B,Main +Monolake/ Polygon_Cities [31460017] [2005]/09 - Monolake - Plumbicon.flac,Dub Techno / Minimal Techno,128.33206176757812,8B,Main +Daso/Go Upstairs [87607257] [2006]/03 - Daso - Until I Find You.flac,Minimal Techno / Tech House,128.3930206298828,10A,Main +deadmau5/ Faxing Berlin x4 [83358547] [2018]/01 - deadmau5 - Faxing Berlin.flac,Progressive House,128.50514221191406,7A,Main +Caribou/ Swim [334913585] [2010]/02 - Caribou - Sun.flac,Indietronica / House,128.65695190429688,,Main +Moderat/Moderat [87387741] [2009]/02 - Moderat - Rusty Nails.flac,IDM / Glitch Pop,128.7318572998047,12A,Main +Extrawelt/ Schöne Neue Extrawelt [63313618] [2008]/02 - Extrawelt - Dark Side of My Room.flac,Techno / Minimal Techno,128.74549865722656,8B,Main +Mathew Jonson/ Marionette [165363476] [2005]/01 - Mathew Jonson - Marionette.flac,Minimal Techno / Tech House,128.86192321777344,1B,Main +Bicep/Isles [157751887] [2021]/01 - Bicep - Atlas.flac,Breaks / UK Bass,128.91839599609375,,Main +Four Tet/Sixteen Oceans [133870268] [2020]/06 - Four Tet - Love Salad.flac,Microhouse / Ambient,128.93954467773438,5A,Main +Modeselektor/ Hello Mom! [87377976] [2005]/06 - Modeselektor - Ziq Zaq.flac,IDM / Electro,128.97760009765625,11B,Main +Various Artists/ Vibe 3 [73212039] [2017]/10 - Shanti Celeste - Strung Up.flac,Breakbeat / House,128.998779296875,,Main +Four Tet/New Energy [79358620] [2017]/09 - Four Tet - SW9 9SL.flac,UK Bass / House,129.0614013671875,9A,Main +Bicep/ Circles EP [364842690] [2014]/01 - Bicep - Circles.flac,House,129.1299285888672,6A,Main +Floating Points/Floating Points - LesAlpx & Coorabell (Ninja Tune) [2019]/02 Floating Points - LesAlpx (Extended).flac,Techno,129.6783905029297,4A,Main +"CJ Bolland, The Advent/ Camargue 2019 [291321527] [2019]/01 - CJ Bolland, The Advent - Camargue 2019.flac",Techno,129.70904541015625,5A,Main +Extrawelt/ Soopertrack [2380807] [2005]/01 - Extrawelt - Soopertrack.flac,Techno / Minimal Techno,129.7407989501953,4A,Main +"Phon.o/Black Boulder [199591543] [2012]/02 - Phon.o, Pantasz - Twilight.flac",Bass Music / Techno,129.75804138183594,8A,Main +"Mall Grab/ How The Dogs Chill, Vol.1 [203947228] [2018]/01 - Mall Grab - Liverpool Street In The Rain.flac",Lo-Fi House,129.84495544433594,12A,Main +Orbital/[M] Orbital 2 [82530740] [1993]/03 - Orbital - Lush 3-1.flac,Progressive Trance / Techno,129.87744140625,11A,Main +Robert Miles/ Remember Robert Miles [74123545] [2017]/01 - Robert Miles - Children (Dream Version).flac,Dream Trance,137.02688598632812,4A,Main +Cignol/Guidance Release [296651317] [2023]/04 - Cignol - Modularity.flac,Electro / Techno,129.91163635253906,6A,Main +Cobblestone Jazz/ 23 Seconds [184856920] [2007]/CD1/02 - Cobblestone Jazz - Hired Touch.flac,Minimal Techno / Tech House,129.92376708984375,,Main +"yungpolar/ Lofi House Tape, Vol. 1 [271715763] [2023]/04 - yungpolar - Amsterdam.flac",Lo-Fi House,129.93638610839844,,Main +Floating Points/Grammar [222925710] [2022]/01 - Floating Points - Grammar.flac,Breaks / UK Bass,129.97512817382812,5A,Main +Moderat/Moderat [87387741] [2009]/03 - Moderat - Seamonkey.flac,IDM / Dubstep,129.98109436035156,7B,Main +"yungpolar/ Lofi House Tape, Vol. 1 [271715763] [2023]/01 - yungpolar - Intro.flac",Lo-Fi House,129.9873046875,8A,Main +DVS1/ Klockworks 13 [102237439] [2014]/01 - DVS1 - Black Russian.flac,Techno,129.9974365234375,12A,Main +Gat Decor/ Passion [40846178] [1992]/03 - Gat Decor - Passion (Naked Mix).flac,Progressive House,124.85189819335938,4A,Main + +Mathew Jonson/ Learning To Fly [135194536] [2011]/01 - Mathew Jonson - Learning To Fly.flac,Minimal Techno / Tech House,130.0073699951172,,Main +Cobblestone Jazz/ 23 Seconds [184856920] [2007]/CD1/03 - Cobblestone Jazz - Lime In Da Coconut.flac,Minimal Techno / Tech House,130.0281524658203,,Main +Phon.o/Black Boulder [199591543] [2012]/01 - Phon.o - Nightshifts.flac,Techno / Bass Music,130.04795837402344,10A,Main +Burial/ Burial [53834442] [2006]/06 - Burial - Southern Comfort.flac,Future Garage / Dubstep,130.2335968017578,,Main +Cobblestone Jazz/ 23 Seconds [184856920] [2007]/CD2/09 - Cobblestone Jazz - India In Me.flac,Minimal Techno / Tech House,130.3125762939453,,Main +Mathew Jonson/ Typerope EP [63020609] [2013]/01 - Mathew Jonson - Typerope (Original Mix).flac,Minimal Techno / Tech House,130.31776428222656,,Main +"Modeselektor/ Monkeytown [199583149] [2011]/08 - Modeselektor, PVT - Green Light Go.flac",Electro / Techno,130.52467346191406,8B,Main +Severed Heads/ Dead Eyes Opened [71820657] [1984]/01 - Severed Heads - Dead Eyes Opened.flac,Industrial / EBM,130.68795776367188,,Main +Cobblestone Jazz/ 23 Seconds [184856920] [2007]/CD1/10 - Cobblestone Jazz - W.flac,Minimal Techno / Tech House,130.82327270507812,,Main +Fatima Yamaha/ A Girl Between Two Worlds [103709112] [2015]/01 - Fatima Yamaha - Between Worlds.flac,Synth Funk / House,131.0084991455078,,Main +Video Unknown/ Keep Dancing 4ever [197191074] [2021]/01 - Video Unknown - Keep Dancing 4ever.flac,House,131.03497314453125,,Main +"The History Of Trance/ The History of Trance '91-'96, Vol. 1 [392650168] [1996]/05 - The History Of Trance - Acid Eiffel.flac",Acid Trance,131.79476928710938,11A,Main +DVS1/ Klockworks 13 [102237439] [2014]/02 - DVS1 - Creepin.flac,Techno,131.98623657226562,8B,Main +NASCAR20/ 200mph [428807211] [2025]/01 - NASCAR20 - 200mph.flac,Hard Techno,131.98670959472656,9A,Main +"Bicep/Bicep, Ejeca, Omar Odyssey - You_Don't EP (2012) [WEB FLAC] {AUS1239}/01 You.flac",Deep House,131.9957275390625,,Main +Basic Channel/ Bcd-2 [87366018] [2008]/03 - Basic Channel - Inversion.flac,Dub Techno,132.01849365234375,8B,Main +Alena/ Turn It Around [167671314] [1999]/03 - Alena - Turn It Around.flac,House / Garage House,132.02525329589844,12B,Main +Cylone/ Lord of the Land [29168400] [2003]/01 - Cylone - Lord of the Land.flac,Techno,132.0474090576172,3B,Main +Mathew Jonson/ Panna Cotta [63092565] [2012]/01 - Mathew Jonson - Panna Cotta.flac,Minimal Techno / Tech House,132.79100036621094,8A,Main +"DVS1, Zak Khutoretsky/ Love Under Pressure [284770191] [2010]/01 - DVS1, Zak Khutoretsky - Polyphonic Love.flac",Techno,132.9979705810547,8B,Main +Phon.o/Black Boulder [199591543] [2012]/06 - Phon.o - ABAW 723.flac,Bass Music / Techno,133.00787353515625,9A,Main +Four Tet/New Energy [79358620] [2017]/05 - Four Tet - Lush.flac,Downtempo / Electronic,133.02320861816406,12A,Main +Energy 52/ Café Del Mar (The Anthems Edits) [311361549] [1997]/02 - Energy 52 - Café Del Mar (Three 'N One Radio Edit).flac,Trance,133.02474975585938,4A,Main +••• HISTORY OF HOUSE 2024 RELOADED VOL 1/Grooveyard - Mary Go Wild (Original).flac,Techno / Hardcore,133.08197021484375,5A,Main +Dave Clarke/ Archive One (2023 Remaster) [349518415] [1996]/06 - Dave Clarke - Wisdom to the Wise (2023 Remaster).flac,Techno,134.5380859375,9B,Main +Loophole/ Situations (I Love You) [297730958] [2003]/01 - Loophole - Situations (I Love You).flac,Progressive House,134.98391723632812,9A,Main +Shanti Celeste/Make Time [73586001] [2017]/01 - Shanti Celeste - Make Time.flac,Breakbeat / House,135.01539611816406,12A,Main +Nikolai/ Ready to Flow (97) [15797235] [1997]/08 - Nikolai - Ready to Flow (Original Mix).flac,Trance,135.02206420898438,5A,Main +Liquid/ Sweet Harmony [2212256] [2004]/01 - Liquid - Sweet Harmony.flac,Breakbeat Hardcore / Rave,135.08383178710938,8B,Main +Four Tet/Pink [79549403] [2012]/01 - Four Tet - Locked.flac,Microhouse / Downtempo,135.16030883789062,9A,Main +Marco V/ Simulated [16473271] [2001]/02 - Marco V - Simulated (Original Mix).flac,Tech Trance,135.22256469726562,,Main +Marmion/ Schöneberg [285730346] [2023]/01 - Marmion - Schöneberg.flac,Trance / Hard Trance,135.41111755371094,11A,Main +KIKO/ World Cup [348586627] [2024]/04 - KIKO - World Cup.flac,Melodic House & Techno,135.50953674316406,6A,Main +"Bicep/Isles [157751887] [2021]/10 - Bicep, machìna - Hawk.flac",Breaks / Ambient,135.9182586669922,9B,Main +Moderat/Moderat [87387741] [2009]/10 - Moderat - Les Grandes Marches.flac,IDM / Techno,135.93882751464844,,Main +Beatport Top 100 Deep House May 2025/Locklead - Apollo (Original Mix).flac,Deep House,135.9693603515625,8A,Main +"At The Villa People/ Open Your Eyes [240076038] [2011]/02 - At The Villa People, Etienne Vandewiele - Open Your Eyes (2009 Remaster).flac",Hard Trance,135.98733520507812,7A,Main +Push/ The Legacy(Remastered Classic Mixes) [218845580] [2022]/01 - Push - The Legacy (Remastered 2001 Remake).flac,Trance,137.08123779296875,4A,Main +Push/ The Legacy(Remastered Classic Mixes) [218845580] [2022]/01 - Push - The Legacy (Remastered 2001 Remake).flac,Trance,137.08123779296875,4A,Main +Push/ Strange World - Remastered [270344199] [2023]/01 - Push - Strange World (Remastered 2000 Remake).flac,Trance,137.23184204101562,10A,Main +Push/ Strange World - Remastered [270344199] [2023]/01 - Push - Strange World (Remastered 2000 Remake).flac,Trance,137.23184204101562,10A,Main +Carlos/ The Silmarillia Remixes [99717802] [1998]/04 - Carlos - The Silmarillia.flac,Trance,137.56430053710938,5A,Main +Various Artists/ Paradise Garage- Inspirations [95507538] [2018]/04 - DJ Rolando - Knights of the Jaguar (Original Mix).flac,Techno,137.6572265625,7A,Main +Art Of Noise/ (Who's Afraid Of) The Art Of Noise- (Remastered) [86476339] [1984]/06 - Art Of Noise - Moments In Love.flac,Ambient / Synth-pop,137.77627563476562,12A,Main +4 Strings/ Take Me Away (Into The Night) [97208941] [2020]/07 - 4 Strings - Take Me Away (Into The Night).flac,Vocal Trance,138.00697326660156,,Main +Push/ Universal Nation - Remastered Classic Mixes [269947846] [2023]/02 - Push - Universal Nation (Remastered Original Extended Mix.flac,Trance,138.00877380371094,,Main +L.S.G. - Netherworld/2005 - Netherworld 2005 [JOOF 024] WEB/04. L.S.G. - Netherworld (Original Mix).flac,Trance,138.0335693359375,8A,Main +Various Artists/ 15 Years Fuse [158929553] [2009]/07 - Link - Amenity.flac,Techno,138.05128479003906,,Main +Brainchild/ Symmetry C [161022074] [1999]/01 - Brainchild - Symmetry C (Original 12- Mix).flac,Progressive Trance,139.81787109375,4A,Main +The Visions Of Shiva - How Much Can You Take (MFS 7042-3)/02. The Visions Of Shiva - How Much Can You Take (Emotional).flac,Hard Trance,139.8653564453125,,Main +Ramin/ Back to Future 1 [28127024] [2012]/02 - Ramin - Pie Jesu (Tracid-Mix).flac,Hard Trance,139.9711151123047,,Main +MASSI-/ Come Wit' It [286935013] [2023]/01 - MASSI- - Come Wit' It.flac,House,139.974365234375,,Main +"Modeselektor/ Monkeytown [199583149] [2011]/10 - Modeselektor, Thom Yorke - This.flac",IDM / Electronic,139.98606872558594,6A,Main +Bicep/Isles [157751887] [2021]/09 - Bicep - Fir.flac,Breaks / UK Bass,139.98751831054688,5A,Main +Kraftwerk/[M] Tour de France (2009 Remaster) [3131398] [2003]/02 - Kraftwerk - Tour de France (Etape 1) [2009 Remaster].flac,Electronic / Synth-pop,140.0033416748047,4A,Main +Various Artists/VA-Clergy_10_Years__Charlie-CRGX3-24BIT-WEB-FLAC-2025-WAVED/01-usaw-kokedama.flac,Techno,140.00772094726562,12B,Main +Sciahri And Hertz Collision-Echoes Of The Void EP-CRG035-24BIT-WEB-FLAC-2024-WAVED/04-sciahri_and_hertz_collision-echoes_of_the_void.flac,Techno,141.00845336914062,8A,Main +Travmkind/ Travmkinder [411935551] [2025]/03 - Travmkind - Living in my mind.flac,Minimal / Deep Tech,142.13510131835938,,Main +"Various Artists/ Clergy 10 Years - Beta [417327786] [2025]/03 - Hertz Collision, Programma 101 - Concrete Skin.flac",Techno,142.94375610351562,12A,Main +Max Simon/ Flashing Colors [288210570] [2022]/01 - Max Simon - Flashing Colors.flac,Deep House,143.02406311035156,10B,Main +Machinedrum/ Room(s) [230172871] [2011]/01 - Machinedrum - She Died There.flac,Footwork / Juke / UK Bass,143.8229217529297,8B,Main +"Various Artists/VA - We Are Secta, Vol. 1 [SECT001]/Danny Wabbit - Girls Like Wine (Original Mix).aiff",Techno,143.9299774169922,,Main +Max Simon/ Flashing Colors [288210570] [2022]/02 - Max Simon - Clouds.flac,Deep House,144.84609985351562,,Main +Sole Dosi/ The Abyss Blooms [417858969] [2025]/03 - Sole Dosi - The Abyss Blooms.flac,Techno,144.86402893066406,9A,Main +Phon.o/Black Boulder [199591543] [2012]/11 - Phon.o - 12th.flac,Bass Music / Techno,144.93170166015625,5A,Main +Vilchezz/ slash 005 - Camelo's [304299374] [2023]/01 - Vilchezz - Camelo's (Original Mix).flac,Minimal / Deep Tech,144.93194580078125,12A,Main +Various Artists/ Clergy 10 Years - Beta [417327786] [2025]/01 - Stef Mendesidis - Hydra.flac,Techno,144.9584503173828,7B,Main +The Prodigy/[E] More Music for the Jilted Generation [2204688] [1994]/CD1/09 - The Prodigy - No Good (Start the Dance) (Remastered).flac,Breakbeat / Big Beat,144.9822998046875,5A,Main +"Various Artists/VA - We Are Secta, Vol. 1 [SECT001]/BENZA995 - Kinky (Original Mix).aiff",Tech House,146.02333068847656,9B,Main +Basic Channel/ Bcd-2 [87366018] [2008]/01 - Basic Channel - Enforcement.flac,Dub Techno,146.5289306640625,,Main +"Various Artists/VA - We Are Secta, Vol. 1 [SECT001]/Ju Lovett - Alive Again (Original Mix).aiff",Tech House,147.00523376464844,11A,Main +Don't F___ With My Energy EP/Danny Wabbit - Don't F- With My Energy EP -.aiff,Techno,148.0142059326172,5A,Main +Wippenberg/ Neurodancer [15921253] [2011]/01 - Wippenberg - Neurodancer (Original Mix).flac,Hard Trance,150.17022705078125,,Main +Gold Panda/ Companion [21583086] [2011]/13 - Gold Panda - Police.flac,Chillwave / Folktronica,151.95773315429688,,Main +Various Artists/VA - Electronic Music Anthology (by FG) (2018) [FLAC]/37. Aurora Borealis - The Milky Way.flac,Trance,153.94393920898438,8A,Main +CD-3/3-13. Kamasutra - Waterfront.flac,Progressive House,156.46304321289062,9A,Main +"Various Artists/[E] Best Of Liquid, Vol. 1 [147202525] [1994]/01 - Buzz & Ace - Killer (4 Ours Mix).flac",Jungle / Hardcore,161.4998321533203,9B,Main +"Franky Jones, Axel Stephenson, Jones & Stephenson/ The First Rebirth [65558851] [2016]/03 - Franky Jones, Axel Stephenson, Jones & Stephenson - The First Rebirth (Original Remastered Mix).flac",Hard Trance,161.50767517089844,1B,Main +"Roni Size, Reprazent/[E] New Forms (20th Anniversary Edition) [276244735] [1997]/CD3/08 - Roni Size, Reprazent - Heroes (Kruder Long Loose Bossa - Edit).flac",Downtempo,161.5162811279297,9A,Main +Travmkind/ Travmkinder [411935551] [2025]/02 - Travmkind - Nothing but a dream.flac,Minimal / Deep Tech,161.7273712158203,8A,Main +CD-3/3-01. Dune - Hardcore Vibes.flac,Happy Hardcore,163.880859375,8A,Main +Monolake/ Momentum [31300339] [2003]/01 - Monolake - Cern.flac,Dub Techno / Minimal Techno,178.20547485351562,8B,Main +Various Artists/VA - Hardcore Vibes (1997) [FLAC]/04 - Lenny Dee - Forgotten Moments.flac,Hardcore / Gabber,95.50914001464844,10A,Main + + +Various Artists/VA - Glasgow Underground Ibiza 2021 [Glasgow Underground] FLAC-2021/06-Stanny Abram - Amellebuee (Extended Mix).flac + + +Various Artists/VA - Glasgow Underground Ibiza 2021 [Glasgow Underground] FLAC-2021/38-Mallin - Off My Mind (Extended Mix).flac MAYBE diff --git a/house.json b/house.json new file mode 100644 index 0000000..d1499f5 --- /dev/null +++ b/house.json @@ -0,0 +1,125 @@ +{ + "settings": { + "output_filename": "/mnt/opslag/test_house.flac", + "default_crossfade_duration": "0:00.00", + "pre_mix_target_dbfs": -12.0, + "final_mix_target_dbfs": -1.0 + }, + "tracks": [ +{ + "song_path": "/mnt/raid_storage/Music/Various Artists/ Naba VA 002 [103500941] [2019]/02 - Münch - Note (Original Mix).flac", + "crossfade_start": "7:21.99", + "fade_power": 1.0, + "fade_out_delay": "1:30.00", + "no_tempo_adjust": true, + "volume_automation": [ + { + "start_time": "7:21.99", + "end_time": "9:21.99", + "gain_db": -1.94 + } + ], + "effects": [ + { + "type": "raw_ffmpeg", + "filter_string": "equalizer=f=1500:t=q:w=1:g=1.6,equalizer=f=5000:t=q:w=1:g=1.6", + "start_time": "7:21.99", + "end_time": "9:21.99" + } + ], + "eq_filters": [ + { + "type": "high_pass", + "cutoff_hz": 80, + "start_time": "7:21.99", + "end_time": "7:51.99" + }, + { + "type": "high_pass", + "cutoff_hz": 120, + "start_time": "7:51.99", + "end_time": "8:21.99" + }, + { + "type": "high_pass", + "cutoff_hz": 180, + "start_time": "8:21.99", + "end_time": "8:51.99" + }, + { + "type": "high_pass", + "cutoff_hz": 250, + "start_time": "8:51.99", + "end_time": "9:21.99" + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/A Forest [88101930] [2012]/03 - Christian Löffler - Eleven.flac", + "crossfade_start": "5:36.00", + "crossfade_duration": "2:00.00", + "fade_in_duration": "0:15.00", + "fade_power": 0.0, + "no_tempo_adjust": true, + "eq_filters": [ + { + "type": "high_pass", + "cutoff_hz": 250, + "start_time": "0:00.00", + "end_time": "0:30.00" + }, + { + "type": "high_pass", + "cutoff_hz": 180, + "start_time": "0:30.00", + "end_time": "1:00.00" + }, + { + "type": "high_pass", + "cutoff_hz": 120, + "start_time": "1:00.00", + "end_time": "1:30.00" + }, + { + "type": "high_pass", + "cutoff_hz": 80, + "start_time": "1:30.00", + "end_time": "2:00.00" + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Christian Löffler/Young Alaska [88102745] [2014]/04 - Christian Löffler - Beirut.flac", + "start_offset": "0:04.56", + "crossfade_start": "5:36.00", + "crossfade_duration": "1:00.00", + "fade_in_duration": "0:10.00", + "fade_power": 1.0, + "no_tempo_adjust": true + }, + { + "song_path": "/mnt/raid_storage/Music/Kiasmos/Kiasmos [103318515] [2014]/03 - Kiasmos - Looped.flac", + "crossfade_start": "6:48.56", + "crossfade_duration": "0:47.75", + "fade_in_duration": "0:05.00", + "fade_power": 1.0, + "no_tempo_adjust": true, + "loops": [ + { + "start_time": "5:46.83", + "end_time": "5:58.78", + "count": 1 + } + ] + }, + { + "song_path": "/mnt/raid_storage/Music/Kiasmos/Blurred [103386930] [2017]/03 - Kiasmos - Jarred.flac", + "crossfade_start": "5:24.04", + "start_offset": "0:00.17", + "crossfade_duration": "1:30.00", + "fade_in_duration": "0:05.00", + "fade_power": 1.0, + "no_tempo_adjust": true + } + ] +} diff --git a/tempo_cache.json b/tempo_cache.json new file mode 100644 index 0000000..22c1d97 --- /dev/null +++ b/tempo_cache.json @@ -0,0 +1,77 @@ +{ + "/mnt/opslag/Album/Album/Krxziol/ The feeling of a dark cold winter outside [281504034] [2022]/01 - Krxziol - The feeling of a dark cold winter outside.flac": 123.046875, + "/mnt/opslag/Album/Album/Tangerine Dream/ Rubycon (Deluxe Version) [110765710] [1975]/01 - Tangerine Dream - Rubycon (Pt. 1 - Remastered 2018).flac": 129.19921875, + "/mnt/opslag/Album/Album/Klaus Schulze/ Timewind [3229881] [1975]/01 - Klaus Schulze - Bayreuth Return.flac": 114.84375, + "/mnt/opslag/Album/Album/Klaus Schulze/ Mirage (Remastered 2017) [82235529] [1977]/02 - Klaus Schulze - Crystal Lake.flac": 126.04801829268293, + "/mnt/opslag/Album/Album/Pauline Anna Strom/ Trans-Millenia Music [79870512] [2017]/05 - Pauline Anna Strom - Energies.flac": 126.04801829268293, + "/mnt/opslag/Album/Album/Klaus Schulze/ Kontinuum [380019868] [2007]/01 - Klaus Schulze - Sequencer (from 70 to 07).flac": 139.6748310810811, + "/mnt/opslag/Album/Album/Astral Pilot, Sven V\u00e4th/ Electro Acupuncture [63331511] [1995]/06 - Astral Pilot, Sven V\u00e4th - The Day After.flac": 129.19921875, + "/mnt/opslag/Album/Album/Biosphere/ Cirque [4186861] [2000]/06 - Biosphere - When I Leave.flac": 109.95678191489361, + "/mnt/opslag/Album/Album/Prins Thomas/Paradise Goulash [188131511] [2015]/36 - Evigt M\u00f6rker - H\u00f6gre.flac": 126.04801829268293, + "/mnt/opslag/Album/Album/Yagya/ Rigning (2018) [89007128] [2018]/02 - Yagya - Rigning Tv\u00f6.flac": 112.34714673913044, + "/mnt/opslag/Album/Album/David August/Diynamic Revisited (By David August) [33582870] [2014]/01 - Kollektiv Turmstrasse - Last Day (David August Revision).flac": 112.34714673913044, + "/mnt/opslag/Album/Album/Primal Code/Primal Code - Caimano Tribe (2019 ep, XW)/04 - Primal Code - Conjuration.flac": 139.6748310810811, + "/mnt/opslag/Album/Album/Primal Code/La Via della Seta [94401315] [2018]/07 - Primal Code - Magellano.flac": 139.6748310810811, + "/mnt/opslag/Album/Album/04 Kollektiv Turmstrasse - Ordinary (Lake People's Circle Motive remix).flac": 120.18531976744185, + "/mnt/opslag/Album/Album/Christian L\u00f6ffler/York [266760278] [2015]/03 - Christian L\u00f6ffler - Nordkap (Original Mix).flac": 120.18531976744185, + "/mnt/opslag/Album/Album/Christian L\u00f6ffler/Mare [88102248] [2016]/06 - Christian L\u00f6ffler - Lid.flac": 120.18531976744185, + "/mnt/opslag/Album/Album/Christian L\u00f6ffler/Young Alaska [88102745] [2014]/03 - Christian L\u00f6ffler - Notes.flac": 120.18531976744185, + "/mnt/opslag/Album/Album/Prins Thomas/Paradise Goulash [188131511] [2015]/25 - Joachim Holm & Alejandro Mosso, Alejandro Mosso - Tre Melodi.flac": 97.50884433962264, + "/mnt/opslag/Album/Album/Brian Eno/ Discreet Music [164531] [1975]/01 - Brian Eno - Discreet Music (Remastered 2004).flac": 123.046875, + "/mnt/opslag/Album/Album/Shanti Celeste/ Tangerine [120578211] [2019]/01 - Shanti Celeste - Sun Notification.flac": 123.046875, + "/mnt/opslag/Album/Album/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/01 - Aphex Twin - #1.flac": 103.359375, + "/mnt/opslag/Album/Album/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/07 - Aphex Twin - #7.flac": 109.95678191489361, + "/mnt/opslag/Album/Album/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/19 - Aphex Twin - #19.flac": 126.04801829268293, + "/mnt/opslag/Album/Album/Brian Eno/ Reflection [272550958] [2017]/01 - Brian Eno - Reflection.flac": 123.046875, + "/mnt/opslag/Album/Album/Steve Roach/ Structures From Silence [333370155] [1984]/03 - Steve Roach - Structures from Silence.flac": 123.046875, + "/mnt/opslag/Album/Album/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/03 - Aphex Twin - #3.flac": 123.046875, + "/mnt/opslag/Album/Album/CD 02/Brian Eno - Neroli - 01 - New Space Music.flac": 126.04801829268293, + "/mnt/opslag/Album/Album/Art Of Noise/[M] The Ambient Collection [46952148] [1990]/06 - Art Of Noise - Camilla (Remixed by Youth).flac": 114.84375, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/Young Alaska [88102745] [2014]/03 - Christian L\u00f6ffler - Notes.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Various Artists/Prins Thomas/Paradise Goulash [188131511] [2015]/25 - Joachim Holm & Alejandro Mosso, Alejandro Mosso - Tre Melodi.flac": 97.50884433962264, + "/mnt/raid_storage/Music/Various Artists/ Naba VA 002 [103500941] [2019]/02 - M\u00fcnch - Note (Original Mix).flac": 120.18531976744185, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/A Forest [88101930] [2012]/03 - Christian L\u00f6ffler - Eleven.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/Young Alaska [88102745] [2014]/04 - Christian L\u00f6ffler - Beirut.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Brian Eno/ Discreet Music [164531] [1975]/01 - Brian Eno - Discreet Music (Remastered 2004).flac": 123.046875, + "/mnt/raid_storage/Music/Shanti Celeste/ Tangerine [120578211] [2019]/01 - Shanti Celeste - Sun Notification.flac": 123.046875, + "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/01 - Aphex Twin - #1.flac": 103.359375, + "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/03 - Aphex Twin - #3.flac": 123.046875, + "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/07 - Aphex Twin - #7.flac": 109.95678191489361, + "/mnt/raid_storage/Music/Art Of Noise/[M] The Ambient Collection [46952148] [1990]/06 - Art Of Noise - Camilla (Remixed by Youth).flac": 114.84375, + "/mnt/raid_storage/Music/Pauline Anna Strom/ Trans-Millenia Music [79870512] [2017]/05 - Pauline Anna Strom - Energies.flac": 126.04801829268293, + "/mnt/raid_storage/Music/Tangerine Dream/ Rubycon (Deluxe Version) [110765710] [1975]/01 - Tangerine Dream - Rubycon (Pt. 1 - Remastered 2018).flac": 129.19921875, + "/mnt/raid_storage/Music/Biosphere/ Cirque [4186861] [2000]/06 - Biosphere - When I Leave.flac": 109.95678191489361, + "/mnt/raid_storage/Music/Primal Code/Primal Code - Caimano Tribe (2019 ep, XW)/04 - Primal Code - Conjuration.flac": 139.6748310810811, + "/mnt/raid_storage/Music/Primal Code/La Via della Seta [94401315] [2018]/07 - Primal Code - Magellano.flac": 139.6748310810811, + "/mnt/raid_storage/Music/Krxziol/ The feeling of a dark cold winter outside [281504034] [2022]/01 - Krxziol - The feeling of a dark cold winter outside.flac": 123.046875, + "/mnt/raid_storage/Music/Klaus Schulze/ Mirage (Remastered 2017) [82235529] [1977]/02 - Klaus Schulze - Crystal Lake.flac": 126.04801829268293, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/York [266760278] [2015]/03 - Christian L\u00f6ffler - Nordkap (Original Mix).flac": 120.18531976744185, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/Mare [88102248] [2016]/06 - Christian L\u00f6ffler - Lid.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Steve Roach/ Structures From Silence [333370155] [1984]/03 - Steve Roach - Structures from Silence.flac": 123.046875, + "/mnt/raid_storage/Music/04 Kollektiv Turmstrasse - Ordinary (Lake People's Circle Motive remix).flac": 120.18531976744185, + "/mnt/raid_storage/Music/Klaus Schulze/ Timewind [3229881] [1975]/01 - Klaus Schulze - Bayreuth Return.flac": 114.84375, + "/mnt/raid_storage/Music/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/19 - Aphex Twin - #19.flac": 126.04801829268293, + "/mnt/raid_storage/Music/Astral Pilot, Sven V\u00e4th/ Electro Acupuncture [63331511] [1995]/06 - Astral Pilot, Sven V\u00e4th - The Day After.flac": 129.19921875, + "/mnt/raid_storage/Music/Klaus Schulze/ Kontinuum [380019868] [2007]/01 - Klaus Schulze - Sequencer (from 70 to 07).flac": 139.6748310810811, + "/mnt/raid_storage/Music/CD 02/Brian Eno - Neroli - 01 - New Space Music.flac": 126.04801829268293, + "/mnt/raid_storage/Music/Brian Eno/ Reflection [272550958] [2017]/01 - Brian Eno - Reflection.flac": 123.046875, + "/mnt/raid_storage/Music/Kiasmos/Kiasmos [103318515] [2014]/03 - Kiasmos - Looped.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Kiasmos/Blurred [103386930] [2017]/03 - Kiasmos - Jarred.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Marcu Rares/ Soul Bonding [175595586] [2021]/01 - Marcu Rares - Soul Bonding.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Plastikman, Richie Hawtin/Artifakts (BC) [137659864] [1998]/02 - Plastikman, Richie Hawtin - Psyk.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Rone/Mirapolis [78562101] [2017]/11 - Rone - Mirapolis.flac": 120.18531976744185, + "/mnt/raid_storage/Music/Various Artists/ Grand Cru 2008 [18274893] [2008]/02 - Wareika - Fantasy (Wareika Remix).flac": 120, + "/mnt/raid_storage/Music/Daso/ All My People [86109655] [2012]/02 - Daso - Dan Lyke.flac": 121, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/A Forest [88101930] [2012]/07 - Christian L\u00f6ffler - Blind.flac": 121, + "/mnt/raid_storage/Music/Stephan Bodzin/ Powers of Ten [45241387] [2015]/01 - Stephan Bodzin - Singularity.flac": 121, + "/mnt/raid_storage/Music/Daniel Avery/Drone Logic [43421119] [2013]/07 - Daniel Avery - Need Electric (Album Version).flac": 122, + "/mnt/raid_storage/Music/Sascha Funke/ Mango [87379506] [2008]/02 - Sascha Funke - We Are Facing the Sun.flac": 122, + "/mnt/raid_storage/Music/Bicep/Just EP [184785872] [2015]/03 - Bicep - Back 2 U.flac": 122, + "/mnt/raid_storage/Music/Various Artists/ HDC003 [352797419] [2016]/02 - Baltra - Tears Drop.flac": 122, + "/mnt/raid_storage/Music/Various Artists/ Memories, Pt. I [139085472] [2017]/05 - Thomas Wood - Cave.flac": 122.1, + "/mnt/raid_storage/Music/Bicep/Bicep [75160673] [2017]/12 - Bicep - Aura.flac": 123, + "/mnt/raid_storage/Music/Christian L\u00f6ffler/A Forest [88101930] [2012]/11 - Christian L\u00f6ffler - A Hundred Lights.flac": 123.046875, + "/mnt/raid_storage/Music/Robag Wruhme/ Olgamikks [16676895] [2012]/10 - Extrawelt - Neuland (Robags Rexmow 001).flac": 123, + "/mnt/raid_storage/Music/Leon Vynehall/ Music for the Uninvited [168277757] [2014]/02 - Leon Vynehall - Goodthing.flac": 123.53, + "/mnt/raid_storage/Music/DJ Boring/ Sunday Avenue [284620418] [2017]/02 - DJ Boring - 6 AM Mimosa.flac": 124 +} \ No newline at end of file diff --git a/test_all_features.json b/test_all_features.json new file mode 100644 index 0000000..e2016f1 --- /dev/null +++ b/test_all_features.json @@ -0,0 +1,83 @@ +{ + "settings": { + "output_filename": "test_all_features_output.flac", + "default_crossfade_duration": "0:05", + "final_mix_target_dbfs": -1.0 + }, + "tracks": [ + { + "song_path": "/mnt/opslag/Album/Album/Shanti Celeste/ Tangerine [120578211] [2019]/01 - Shanti Celeste - Sun Notification.flac", + "crossfade_duration": "0:08", + "crossfade_start": "4:55.00", + "start_offset": "0:38.64", + "fade_power": 1.0, + "loops": [ + { + "start_time": "1:00.00", + "end_time": "1:02.00", + "count": 2 + } + ], + "volume_automation": [ + { + "start_time": "1:30.00", + "end_time": "1:35.00", + "gain_db": -6 + } + ], + "eq_filters": [ + { + "type": "high_pass", + "cutoff_hz": 1000, + "start_time": "2:00.00", + "end_time": "2:05.00" + }, + { + "type": "band_reject", + "low_cutoff_hz": 400, + "high_cutoff_hz": 2000, + "start_time": "2:10.00", + "end_time": "2:15.00" + } + ], + "effects": [ + { + "type": "delay", + "start_time": "3:00.00", + "end_time": "3:02.00", + "delay_ms": 250, + "intensity": 0.5 + } + ] + }, + { + "song_path": "/mnt/opslag/Album/Album/Aphex Twin/ Selected Ambient Works Volume II (Expanded Edition [366456437] [1994]/01 - Aphex Twin - #1.flac", + "start_offset": "0:14.84", + "fade_power": 1.0, + "no_tempo_adjust": true, + "eq_filters": [ + { + "type": "low_pass", + "cutoff_hz": 500, + "start_time": "0:30.00", + "end_time": "0:35.00" + }, + { + "type": "band_pass", + "low_cutoff_hz": 300, + "high_cutoff_hz": 1500, + "start_time": "0:40.00", + "end_time": "0:45.00" + } + ], + "effects": [ + { + "type": "reverb", + "start_time": "1:00.00", + "end_time": "1:05.00", + "wet": 0.25 + } + ] + } + ] +} \ No newline at end of file