From b57321350d62ce129633e4508db850478c4155d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Djk=C3=A1=C5=A5o?= Date: Wed, 27 Dec 2023 18:47:54 +0100 Subject: [PATCH] linuxify ffmpeg --- packages/preprocessor/src/generate_db.ts | 91 ++++----- packages/preprocessor/src/media_process.js | 223 ++++++++++----------- packages/preprocessor/src/songs_list.ts | 2 +- 3 files changed, 158 insertions(+), 158 deletions(-) diff --git a/packages/preprocessor/src/generate_db.ts b/packages/preprocessor/src/generate_db.ts index 8246948..3a880aa 100644 --- a/packages/preprocessor/src/generate_db.ts +++ b/packages/preprocessor/src/generate_db.ts @@ -2,53 +2,54 @@ import { Collection, Ref, RefTo, Song, DB, } from "@euterpe.js/music-library" import { songs } from "./songs_list" export function generate_db() { - console.log(songs) - // construct db - let db = new DB - let collections: string[] = new Array() - let new_songs = [] + console.log(songs) + // construct db + let db = new DB + let collections: string[] = new Array() + let new_songs = [] + const path_char = songs[0].includes("\\") ? "\\" : "/" - //create collections by folder names - for (let i = 0; i < songs.length; i++) { - const song = songs[i] - const last_i = song.lastIndexOf("\\") - const collection_name = song.slice(song.slice(0, last_i).lastIndexOf("\\") + 1, last_i) - /* - const foreforelast_i = song.slice(0, forelast_i - 1) - const foreforeforelast_i = song.slice(0, foreforelast_i - 1).lastIndexOf("\\") - */ - if (!collections.includes(collection_name)) { - console.log(`creating collection ${collection_name}`) - db.add([new Collection({ - name: collection_name, - songs: [], - artists: [], - })]) - collections.push(collection_name) - } + //create collections by folder names + for (let i = 0; i < songs.length; i++) { + const song = songs[i] + const last_i = song.lastIndexOf(path_char) + const collection_name = song.slice(song.slice(0, last_i).lastIndexOf(path_char) + 1, last_i) + /* + const foreforelast_i = song.slice(0, forelast_i - 1) + const foreforeforelast_i = song.slice(0, foreforelast_i - 1).lastIndexOf("\\") + */ + if (!collections.includes(collection_name)) { + console.log(`creating collection ${collection_name}`) + db.add([new Collection({ + name: collection_name, + songs: [], + artists: [], + })]) + collections.push(collection_name) + } - let col = db.collections.find(col => col.name == collection_name)! - let col_id = col.id - new_songs.push({ song: song, collection_id: col_id! }) - } + let col = db.collections.find(col => col.name == collection_name)! + let col_id = col.id + new_songs.push({ song: song, collection_id: col_id! }) + } - //create songs - for (let i = 0; i < new_songs.length; i++) { - let song = new_songs[i] - const last_i = song.song.lastIndexOf("\\") + //create songs + for (let i = 0; i < new_songs.length; i++) { + let song = new_songs[i] + const last_i = song.song.lastIndexOf(path_char) - const name = song.song.slice(last_i + 1) - const song_url = song.song.slice(song.song.indexOf("public\\") + 7) - const db_song = new Song({ - name: name.slice(0, name.lastIndexOf(".")), - artists: [], - url: new URL(`${window.location.href}${song_url}`.replaceAll("\\", "/")), - duration: 0, - remix_artists: [], - in_collection: new Ref(RefTo.Collections, song.collection_id) - }) - db.add([db_song]) - } - console.log(db) - return db + const name = song.song.slice(last_i + 1) + const song_url = song.song.slice(song.song.indexOf(`public${path_char}`) + 7) + const db_song = new Song({ + name: name.slice(0, name.lastIndexOf(".")), + artists: [], + url: new URL(`${window.location.href}${song_url}`.replaceAll("\\", "/")), + duration: 0, + remix_artists: [], + in_collection: new Ref(RefTo.Collections, song.collection_id) + }) + db.add([db_song]) + } + console.log(db) + return db } diff --git a/packages/preprocessor/src/media_process.js b/packages/preprocessor/src/media_process.js index 96706f3..9d8c122 100644 --- a/packages/preprocessor/src/media_process.js +++ b/packages/preprocessor/src/media_process.js @@ -9,144 +9,143 @@ import { execSync, exec } from 'child_process' import { fstat, unlinkSync } from "fs" function generate_new_photo_sizes(file, currentExtention) { - const path = file.substring(0, file.lastIndexOf("\\")) - file = file.substring(file.lastIndexOf("\\") + 1) - let command = "" - command += `cd "${path}" && start cmd /k "` - command += `ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -quality 90 -compression_level 6 "${file}_ogw.webp" ` - command += ` -vf scale=1000:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_1000p.webp"` - command += ` -vf scale=800:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_800p.webp"` - command += ` -vf scale=500:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_500p.webp"` - command += ` -vf scale=320:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_320p.webp"` - command += ` && exit"` - exec(command) + const path = file.substring(0, file.lastIndexOf("\\")) + file = file.substring(file.lastIndexOf("\\") + 1) + let command = "" + command += `cd "${path}" && konsole -e "` + command += `ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -quality 90 -compression_level 6 "${file}_ogw.webp" ` + command += ` -vf scale=1000:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_1000p.webp"` + command += ` -vf scale=800:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_800p.webp"` + command += ` -vf scale=500:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_500p.webp"` + command += ` -vf scale=320:-1 -lossless 0 -quality 90 -compression_level 6 "${file}_320p.webp"` + command += ` && exit"` + exec(command) } function generate_new_anim_photo_sizes(file, currentExtention) { - exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw_static.webp" -vf scale=1000:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w_static.webp" -vf scale=800:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w_static.webp" -vf scale=500:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w_static.webp" -vf scale=320:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w_static.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -lossless 0 -frames:v 1 -r 1 -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder_static.webp"`) - exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw.webp" -vf scale=1000:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w.webp" -vf scale=800:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w.webp" -vf scale=500:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w.webp" -vf scale=320:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -frames:v 1 -lossless 0 -c:v libwebp -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder.webp"`) + exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw_static.webp" -vf scale=1000:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w_static.webp" -vf scale=800:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w_static.webp" -vf scale=500:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w_static.webp" -vf scale=320:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w_static.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -lossless 0 -frames:v 1 -r 1 -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder_static.webp"`) + exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw.webp" -vf scale=1000:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w.webp" -vf scale=800:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w.webp" -vf scale=500:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w.webp" -vf scale=320:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -frames:v 1 -lossless 0 -c:v libwebp -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder.webp"`) } function generate_new_sounds_ogg(file, currentExtention) { - const path = file.substring(0, file.lastIndexOf("\\")) - file = file.substring(file.lastIndexOf("\\") + 1) + const path = file.substring(0, file.lastIndexOf("\\")) + file = file.substring(file.lastIndexOf("\\") + 1) - let command = "" - command += `cd "${path}" && start cmd /k "` - command += `ffmpeg -y -i "${file}.${currentExtention}" ` - //Adds 25ms of delay to all samples - command += `-af "adelay=25:all=true" ` - //So the demo is HQ - if (file.includes("Luna Lenta")) command += `-c:a libopus -b:a 256k "${file}.ogg"` - else command += `-c:a libopus -b:a 96k "${file}.ogg"` - command += ` && exit"` - exec(command) - // console.log(command) + let command = "" + command += `konsole -e "` + command += `ffmpeg -y -i '${file}.${currentExtention}' ` + //Adds 25ms of delay to all samples + command += `-af 'adelay=25:all=true' ` + //So the demo is HQ + if (file.includes("demo")) command += `-c:a libopus -b:a 256k '${file}.ogg'"` + else command += `-c:a libopus -b:a 96k '${file}.ogg'"` + exec(command) + console.log(command) } function generate_new_sounds_mp3(file, currentExtention) { - const path = file.substring(0, file.lastIndexOf("\\")) - file = file.substring(file.lastIndexOf("\\") + 1) + const path = file.substring(0, file.lastIndexOf("\\")) + file = file.substring(file.lastIndexOf("\\") + 1) - let command = "" - command += `cd "${path}" && start cmd /k "` - command += `ffmpeg -y -i "${file}.${currentExtention}" ` - //Adds 25ms of delay to all samples - command += `-af "adelay=25:all=true" ` - command += `-b:a 160k "${file}.mp3"` - command += ` && exit"` - exec(command) - // console.log(command) + let command = "" + command += `konsole -e "` + command += `ffmpeg -y -i '${file}.${currentExtention}' ` + //Adds 25ms of delay to all samples + command += `-af 'adelay=25:all=true' ` + if (file.includes("demo")) command += `-b:a 256k '${file}.mp3'"` + else command += `-b:a 160k '${file}.mp3'"` + exec(command) + // console.log(command) } function generate_new_video_sizes_mp4(file, currentExtention, width_resolutions) { - const path = file.substring(0, file.lastIndexOf("\\")) - file = file.substring(file.lastIndexOf("\\") + 1) + const path = file.substring(0, file.lastIndexOf("\\")) + file = file.substring(file.lastIndexOf("\\") + 1) - let command = "" - command += `cd "${path}" && ` - command += `del ffmpeg2pass-0.log && ` - command += `ffmpeg -y -i "${file}.${currentExtention}" ` - command += `-vcodec libx264 -g 240 -b:v 3M ` - command += `-pass 1 -f mp4 NUL && exit` + let command = "" + command += `cd "${path}" && ` + command += `del ffmpeg2pass-0.log && ` + command += `ffmpeg -y -i "${file}.${currentExtention}" ` + command += `-vcodec libx264 -g 240 -b:v 3M ` + command += `-pass 1 -f mp4 NUL && exit` - exec(command).once("exit", () => { - for (const resolution of width_resolutions) { - let res_command = "" - res_command += `start cmd /k "` - res_command += `cd "${path}" && ` - res_command += `ffmpeg -y -i "${file}.${currentExtention}" ` - res_command += `-vcodec libx264 -g 240 -b:v 3M -vf scale=${resolution}:-2 -pass 2 "${file}_${resolution}p.mp4"` - res_command += "&& exit\"" - exec(res_command) - } - }) + exec(command).once("exit", () => { + for (const resolution of width_resolutions) { + let res_command = "" + res_command += `konsole -e "` + res_command += `cd "${path}" && ` + res_command += `ffmpeg -y -i "${file}.${currentExtention}" ` + res_command += `-vcodec libx264 -g 240 -b:v 3M -vf scale=${resolution}:-2 -pass 2 "${file}_${resolution}p.mp4"` + res_command += "&& exit\"" + exec(res_command) + } + }) } function generate_new_video_sizes_webm(file, currentExtention, width_resolutions) { - const path = file.substring(0, file.lastIndexOf("\\")) - file = file.substring(file.lastIndexOf("\\") + 1) + const path = file.substring(0, file.lastIndexOf("\\")) + file = file.substring(file.lastIndexOf("\\") + 1) - let command = "" - command += `cd "${path}" && ` - command += `del ffmpeg2pass-0.log && ` - command += `ffmpeg -y -i "${file}.${currentExtention}" ` - command += `-vcodec libvpx-vp9 -cpu-used 0 -deadline good -quality good -g 240 -crf 42 -b:v 0 -c:a libopus -row-mt 1 -tile-rows 2 -tile-columns 4 -threads 16 -auto-alt-ref 6 ` - command += `-pass 1 -f webm NUL && exit` + let command = "" + command += `cd "${path}" && ` + command += `del ffmpeg2pass-0.log && ` + command += `ffmpeg -y -i "${file}.${currentExtention}" ` + command += `-vcodec libvpx-vp9 -cpu-used 0 -deadline good -quality good -g 240 -crf 42 -b:v 0 -c:a libopus -row-mt 1 -tile-rows 2 -tile-columns 4 -threads 16 -auto-alt-ref 6 ` + command += `-pass 1 -f webm NUL && exit` - exec(command).once("exit", () => { - for (const resolution of width_resolutions) { - let res_command = "" - res_command += `start cmd /k "` - res_command += `cd "${path}" && ` - res_command += `ffmpeg -y -i "${file}.${currentExtention}" ` - res_command += `-vcodec libvpx-vp9 -cpu-used 0 -deadline good -quality good -g 240 -vf scale=${resolution}:-1 -crf 42 -b:v 0 -c:a libopus -row-mt 1 -tile-rows 2 -tile-columns 4 -threads 16 -auto-alt-ref 6 -pass 2 "${file}_${resolution}p.webm"` - res_command += "&& exit\"" - exec(res_command) - } - }) + exec(command).once("exit", () => { + for (const resolution of width_resolutions) { + let res_command = "" + res_command += `konsole -e "` + res_command += `cd "${path}" && ` + res_command += `ffmpeg -y -i "${file}.${currentExtention}" ` + res_command += `-vcodec libvpx-vp9 -cpu-used 0 -deadline good -quality good -g 240 -vf scale=${resolution}:-1 -crf 42 -b:v 0 -c:a libopus -row-mt 1 -tile-rows 2 -tile-columns 4 -threads 16 -auto-alt-ref 6 -pass 2 "${file}_${resolution}p.webm"` + res_command += "&& exit\"" + exec(res_command) + } + }) } let dirs = filehound.create() - .path("../public/media") - .directory() - .findSync() + .path("../public") + .directory() + .findSync() console.log(dirs) for (let i = 0; i < dirs.length; i++) { - //gets current name file+ext - let current_folder_files = filehound.create() - .path(`${dirs[i]}`) - .findSync() + //gets current name file+ext + let current_folder_files = filehound.create() + .path(`${dirs[i]}`) + .findSync() - if (current_folder_files[0] != undefined) { - //if previous encode was cancelled and 2pass log not removed, remove it :) - if (current_folder_files[0].includes("ffmpeg2pass-0.log")) { - try { unlinkSync(`${dirs[i]}/ffmpeg2pass-0.log`) } catch (err) { } - current_folder_files = current_folder_files.slice(1) - } - for (let current_media of current_folder_files) { - current_media = [current_media.substring(0, current_media.lastIndexOf(".")), current_media.substring(current_media.lastIndexOf(".") + 1)] - if (current_media[1] == "wav" || current_media[1] == "mp3") { - console.log(`${current_media[0]}.${current_media[1]}\n`) + if (current_folder_files[0] != undefined) { + //if previous encode was cancelled and 2pass log not removed, remove it :) + if (current_folder_files[0].includes("ffmpeg2pass-0.log")) { + try { unlinkSync(`${dirs[i]}/ffmpeg2pass-0.log`) } catch (err) { } + current_folder_files = current_folder_files.slice(1) + } + for (let current_media of current_folder_files) { + current_media = [current_media.substring(0, current_media.lastIndexOf(".")), current_media.substring(current_media.lastIndexOf(".") + 1)] + if (current_media[1] == "wav") { + console.log(`${current_media[0]}.${current_media[1]}\n`) - generate_new_sounds_ogg(`${current_media[0]}`, `${current_media[1]}`) - if (current_media[1] == "mp3") continue - generate_new_sounds_mp3(`${current_media[0]}`, `${current_media[1]}`) - } + generate_new_sounds_ogg(`${current_media[0]}`, `${current_media[1]}`) + generate_new_sounds_mp3(`${current_media[0]}`, `${current_media[1]}`) + } - if (current_media[1] == "webm" || current_media[1] == "mov" || current_media[1] == "avi" || current_media[1] == "mp4") { - if (/\_\d*p/.test(current_media[0])) continue - // console.log(`Video: ${current_media[0]}.${current_media[1]}\n`) - // generate_new_video_sizes_webm(`${current_media[0]}`, `${current_media[1]}`, [1440, 1080, 720, 480]) - // generate_new_video_sizes_mp4(`${current_media[0]}`, `${current_media[1]}`, [1440, 1080, 720, 480]) - } - if (current_media[1] == "png" || current_media[1] == "jpg") { - console.log(`.\\${current_media[0]}.${current_media[1]}\n`) + /* + if (current_media[1] == "webm" || current_media[1] == "mov" || current_media[1] == "avi" || current_media[1] == "mp4") { + if (/\_\d*p/.test(current_media[0])) continue + // console.log(`Video: ${current_media[0]}.${current_media[1]}\n`) + // generate_new_video_sizes_webm(`${current_media[0]}`, `${current_media[1]}`, [1440, 1080, 720, 480]) + // generate_new_video_sizes_mp4(`${current_media[0]}`, `${current_media[1]}`, [1440, 1080, 720, 480]) + } + if (current_media[1] == "png" || current_media[1] == "jpg") { + console.log(`.\\${current_media[0]}.${current_media[1]}\n`) - generate_new_photo_sizes(`.\\${current_media[0]}`, `${current_media[1]}`) - } - if (current_media[1] == "gif") { - console.log(`.\\${current_media[0]}.${current_media[1]}\n`) + generate_new_photo_sizes(`.\\${current_media[0]}`, `${current_media[1]}`) + } + if (current_media[1] == "gif") { + console.log(`.\\${current_media[0]}.${current_media[1]}\n`) - generate_new_anim_photo_sizes(`.\\${current_media[0]}`, `${current_media[1]}`) - } - } - } + generate_new_anim_photo_sizes(`.\\${current_media[0]}`, `${current_media[1]}`) + }*/ + } + } } diff --git a/packages/preprocessor/src/songs_list.ts b/packages/preprocessor/src/songs_list.ts index 43a5a84..6471b09 100644 --- a/packages/preprocessor/src/songs_list.ts +++ b/packages/preprocessor/src/songs_list.ts @@ -1 +1 @@ -export const songs = ["..\\public\\samples\\bass\\01 HTS Arp Bass.ogg","..\\public\\samples\\bass\\02 HTS Hard Bass.ogg","..\\public\\samples\\bass\\03 HTS Break Bass.ogg","..\\public\\samples\\bass\\04 HTS Sub Bass.ogg","..\\public\\samples\\demos\\Demo by Luna Lenta and Nuphory.ogg","..\\public\\samples\\drums\\01 HTS Rides and Hats.ogg","..\\public\\samples\\drums\\02 HTS Claps and Hats.ogg","..\\public\\samples\\drums\\03 HTS Club Snares.ogg","..\\public\\samples\\drums\\04 HTS Buildup Snares.ogg","..\\public\\samples\\FX\\01 HTS Boom Kicks.ogg","..\\public\\samples\\FX\\02 HTS Verbclaps.ogg","..\\public\\samples\\FX\\03 HTS Noisesweep.ogg","..\\public\\samples\\FX\\04 HTS Combined FX.ogg","..\\public\\samples\\kicks\\01 HTS Trancekick.ogg","..\\public\\samples\\kicks\\02 HTS Sizzle Layer.ogg","..\\public\\samples\\kicks\\03 HTS Transients.ogg","..\\public\\samples\\kicks\\04 HTS Kick Combined.ogg","..\\public\\samples\\loops\\01 HTS Loop CH.ogg","..\\public\\samples\\loops\\02 HTS Loop OH.ogg","..\\public\\samples\\loops\\03 HTS Perc Loop.ogg","..\\public\\samples\\loops\\04 HTS Full Loop.ogg","..\\public\\samples\\synths\\01 HTS Leads and Bass 01.ogg","..\\public\\samples\\synths\\02 HTS Leads and Pads 01.ogg","..\\public\\samples\\synths\\03 HTS Leads and Bass 02.ogg","..\\public\\samples\\synths\\04 HTS Leads and Pads 02.ogg"] \ No newline at end of file +export const songs = ["../public/samples/FX/01 HTS Boom Kicks.ogg","../public/samples/FX/02 HTS Verbclaps.ogg","../public/samples/FX/03 HTS Noisesweep.ogg","../public/samples/FX/04 HTS Combined FX.ogg","../public/samples/bass/01 HTS Arp Bass.ogg","../public/samples/bass/02 HTS Hard Bass.ogg","../public/samples/bass/03 HTS Break Bass.ogg","../public/samples/bass/04 HTS Sub Bass.ogg","../public/samples/demos/01 demo 1 - Violet Delta & Eyhz.ogg","../public/samples/demos/02 demo 2 - Walras.ogg","../public/samples/demos/03 demo 3 - G4TE-16.ogg","../public/samples/demos/04 demo 4 - shadeux.ogg","../public/samples/demos/05 demo 5 - crowit.ogg","../public/samples/demos/06 demo 6 - sh0wtime.ogg","../public/samples/demos/07 demo 7 - nuphory & Luna Lenta.ogg","../public/samples/drums/01 HTS Rides and Hats.ogg","../public/samples/drums/02 HTS Claps and Hats.ogg","../public/samples/drums/03 HTS Club Snares.ogg","../public/samples/drums/04 HTS Buildup Snares.ogg","../public/samples/kicks/01 HTS Trancekick.ogg","../public/samples/kicks/02 HTS Sizzle Layer.ogg","../public/samples/kicks/03 HTS Transients.ogg","../public/samples/kicks/04 HTS Kick Combined.ogg","../public/samples/loops/01 HTS Loop CH.ogg","../public/samples/loops/02 HTS Loop OH.ogg","../public/samples/loops/03 HTS Perc Loop.ogg","../public/samples/loops/04 HTS Full Loop.ogg","../public/samples/synths/01 HTS Leads and Bass 01.ogg","../public/samples/synths/02 HTS Leads and Pads 01.ogg","../public/samples/synths/03 HTS Leads and Bass 02.ogg","../public/samples/synths/04 HTS Leads and Pads 02.ogg"] \ No newline at end of file