From d4081168d964298bf453a9837cce4b3309127f6d Mon Sep 17 00:00:00 2001 From: positionhigh Date: Mon, 30 Aug 2021 18:00:15 +0200 Subject: [PATCH] =?UTF-8?q?Dateien=20hochladen=20nach=20=E2=80=9Eaddon/Dru?= =?UTF-8?q?ms=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addon/Drums/vl1-Hbeep.wav | Bin 0 -> 3988 bytes addon/Drums/vl1-Lbeep.wav | Bin 0 -> 5974 bytes addon/Drums/wav2c.sh | 250 ++++++++++++++++++++++++++++++++++++++ addon/Drums/wav2sketch | Bin 0 -> 14484 bytes 4 files changed, 250 insertions(+) create mode 100644 addon/Drums/vl1-Hbeep.wav create mode 100644 addon/Drums/vl1-Lbeep.wav create mode 100644 addon/Drums/wav2c.sh create mode 100644 addon/Drums/wav2sketch diff --git a/addon/Drums/vl1-Hbeep.wav b/addon/Drums/vl1-Hbeep.wav new file mode 100644 index 0000000000000000000000000000000000000000..aebaea343a259287a1391b0f54db65ba1fe61dc8 GIT binary patch literal 3988 zcmZWr2V9fa7C(n1j08denX*w3WjJx`b0LBgw<6Z9D71CdSywIU&$?Rc##*ar6>YU@ zL7!Hwq7;$?eHAsB%KRVA&XZ&X=1P_0a_6ed^Dwt0f14_#=$N8FEDZG; zdun3x*kR*ej^U3j8kIbHBff(Ze-?uSUJM@q3pf`yy?xY>zBjeqQdLAxM`f zD&_9V{?g(q)sT=u+Xn3$xGm5uaA80%|KI(e_5Z>@!^bvI<}f=g`Y*S%`>CPQDN+kr zZ~0M~dB$HdKSiT-lX}j8HG{7N^cfiE?-20TuW5kD@1t+zfHohG0b4yLE0!dWN{dOk znzlDJNV-OvA$5?SlkHExEB8}mI;i_!_v+_!!wdQbdHH%>@J#eL=aKK;>K5x>R8ai- zo-`(9k5rmkEd5y;Cu3xF^6%seGFj;|@oN7NuYi74UXS}8@#^qO_AKxm<8jvWtm~G( zBde1B{86?iMI{xaEs-guW8@XG_HToPOb z&N|o8j_#fU{3PXxe64h!e75}4^u6i18T~Ti6(Jd6%3!%qg^7!`Q-zbM(>X_PN4-O{ z{X>VNb}t>a^xE!ZVd|D%CcmAoO0UoG&wQMDTM?nynEhO_G)JsxDLUe4=K7-dQ)l1a z8+#`>^>Ui&l~D+bFwXwqtCSy+V6U?v-gX)aIs*UFnSU$I3g3pOq)GU31KH)H(fCm>aJu&5O%P zGB$U8Z5QPfY5&|Iz&_6YhF!MZU0a#mI~zO4h&p|`Rqm|pt?IPuS?-Bkk9>LV z4E66h-*oJvI#Upx|DYhNV7vN` z`uoD5!nZ{$3s0ADPALtAE}K`zE9aMM$|K7cRSqf(hBH=K=Ho4=S_Fy1EiPEF=2I;eoA0!+ z6ZN;$x2-P?uJA0gs@PT@T`{-9wz8KZpSx;0rfZED)rRMn(uI{qP{iMTbI zgkeVeumP`QI>zBMJdf|u53d{DZ$H$ux%u*kUCm+5PnsV!3tPl3hgT%jl28(e%? z;}<57+0U$H;+Sult4u8OggMTXGh3K>tVXx=W9moQM?t%Fdr*6Ldn}=p_M7eFIuhHr zYrlk4NQ9U08s32%-asvp8wvZP4>)UgbQE;F?g-RMv~#sHwL7$Xwa>MQT8*|%>(uGj zIiqu3=c3M?ohLePcE0TV(Am<-cDm{Y=~n5Yb(?iZb@94;x>q{2u1wdi>#ZN6AEBSC zkJ88JWA&HxxAlqoxB48tMvsh`v1NRiG0bdcI-%FNlx>z z01L@U9+9NvT!U(|t0FrE>M@e-NO5M#iXNhOAmF#vr?Wqi<+)TTGOpd&h<4faAYT9CR437HTwLjidt z>7awuv<2GXBjE<9B2})1_gz#9g-`-Tpn!bH1SR7m^m8}U>xC*q?3bS6bymk zFc1bq0Qi#*_a)>FUeE_z$mjrW;6z48umL;5mV`~o>(B&5gau#>Jo0ul1(r1dh82)E zq=3i*vd07d-@C?S=8-ogC4_EPb@I35s{J1RAyQ3 zjIQ-8zw4YOIt+`%BgdRbmuDRU8XaZz39vdHPsNT@yTjOIkwoL>%E>Ye6A(V)4} zJh{v%euliLFNzv>wrj&$l6dty3?H}5={8Srl1QO&J)uW5m!fwdv_!~G3l-x=Z8kg#lYoEJArzqIB_<+ zd&00s?{QYUaif){wWAqur-p2)Z5k!bl*Yv6-^m(-mgK>q$=#<`sdZX;mi)NedDo1;Qs}#kvJFD(BweU|noXwuS!`U_9!}SZ-Z-$QUnFaO7A;Wc)p%Z$3 n?>$lZU)g|Ccjc%ZLq+K~Msws)pqOxd)qO%EH^fAd;col~*eZ>f literal 0 HcmV?d00001 diff --git a/addon/Drums/vl1-Lbeep.wav b/addon/Drums/vl1-Lbeep.wav new file mode 100644 index 0000000000000000000000000000000000000000..014dde318e110c1f16e04f6e7c22cf54c2ac5156 GIT binary patch literal 5974 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 literal 0 HcmV?d00001 diff --git a/addon/Drums/wav2c.sh b/addon/Drums/wav2c.sh new file mode 100644 index 0000000..f7f647f --- /dev/null +++ b/addon/Drums/wav2c.sh @@ -0,0 +1,250 @@ +#!/bin/bash +# +# Converter for WAV to C Header +# Used for MicroDexed sampler +# +# (c) 2021 Holger Wirtz +# + +SOX=`which sox` +XXD=`which xxd` +TMP="/Volumes/DATA/temp/dexed" +AUDIO_BLOCK_SIZE=128 +DRUMSET_H="drumset.h" +DRUMS_H="drums.h" + +function cleanexit() +{ + #rm -rf "${TMP}" + echo -n "" +} + +trap cleanexit EXIT + +if [ -z "${SOX}" ] +then + echo "Cannot find 'sox' in your PATH." >&2 + exit 100 +fi + +if [ -z "${XXD}" ] +then + echo "Cannot find 'xxd' in your PATH." >&2 + exit 101 +fi + +POSITIONAL=() +while [[ $# -gt 0 ]]; do + key="$1" + + case $key in + -c|--config) + CONFIG="$2" + shift # past argument + shift # past value + ;; + -w|--wavs) + WAV_DIR="/Users/nexus/Desktop/dexedDevelopment/samples_dexed" + shift # past argument + shift # past value + ;; +# -t|--test) +# TEST="true" +# shift # past argument +# ;; + *) # unknown option + POSITIONAL+=("$1") # save it in an array for later + shift # past argument + ;; + esac +done + +if [ ! -f "${CONFIG}" ] +then + echo "Cannot find configuration file." >&2 + exit 200 +fi + +if [ ! -d "${WAV_DIR}" ] +then + echo "Cannot find folder for WAV files." >&2 + exit 201 +fi + +if (( `ls "${WAV_DIR}" | wc -l` == 0 )) +then + echo "Cannot find any file in ${WAV_DIR}." >&2 + exit 202 +fi + +mkdir -p "${TMP}" +echo "#pragma once" >"${DRUMSET_H}" +rm -f "${DRUMS_H}" +cat >> "${DRUMS_H}" << EOF +/* + MicroDexed + + MicroDexed is a port of the Dexed sound engine + Dexed ist heavily based on https://github.com/google/music-synthesizer-for-an +droid + + (c)2018-2021 H. Wirtz + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + THE SOFTWARE. +*/ + +#include +#include "config.h" +#include "drumset.h" + +#ifndef _DRUMS_H +#define _DRUMS_H + +typedef struct drum_config_s { + uint8_t drum_class; // Type of drum + uint8_t midinote; // Triggered by note + char name[DRUM_NAME_LEN]; + const uint8_t* drum_data; + char shortname[2]; // 1 char name for sequencer + uint32_t len; // number of elements in drum_data + float32_t pitch; // + float32_t pan; // Panorama (-1.0 - +1.0) + float32_t vol_max; // max. Volume (0.0 - 1.0) + float32_t vol_min; // min. Volume (0.0 - 1.0, should be <= vol_max) + float32_t reverb_send; // how much signal to send to the reverb (0.0 - 1.0) +} drum_config_t; + +enum {DRUM_NONE, DRUM_BASS, DRUM_SNARE, DRUM_HIHAT, DRUM_HANDCLAP, DRUM_RIDE, DRUM_CHRASH, DRUM_LOWTOM, DRUM_MIDTOM, DRUM_HIGHTOM, DRUM_PERCUSSION}; + +// DEFAULT MIDI CHANNEL FOR SAMPLEDRUMS +uint8_t drum_midi_channel = 10; + +drum_config_t drum_config[NUM_DRUMSET_CONFIG] = +{ +EOF + +declare -a converted_files + +while IFS= read -r l +do + declare -a sample + + if [[ "${l:0:1}" == "#" ]] + then + continue + fi + IFS=',' read -ra samplecfg <<< "${l}" + + sample['class']=`echo "${samplecfg[0]}" | xargs` + sample['midinote']=`echo "${samplecfg[1]}" | xargs` + sample['name']=`echo "${samplecfg[2]}" | xargs` + sample['data_name']="${sample['name']}" + sample['shortname']=`echo "${samplecfg[3]}" | xargs` + sample['pitch']=`echo "${samplecfg[4]}" | xargs` + sample['pan']=`echo "${samplecfg[5]}" | xargs` + sample['vol_max']=`echo "${samplecfg[6]}" | xargs` + sample['vol_min']=`echo "${samplecfg[7]}" | xargs` + sample['reverb_send']=`echo "${samplecfg[8]}" | xargs` + sample['filename']=`echo "${samplecfg[9]}" | xargs` + + if [ -f "${WAV_DIR}/${sample['filename']}" ] + then + file "${WAV_DIR}/${sample['filename']}" | grep -i -q "WAVEfmt" + if [ "${?}" == 0 ] + then + # Generate drumset.h + + if [ -z "${converted_files[${sample['filename']}]}" ] + then + basename=`echo "${sample['filename']}" | cut -d'.' -f1` + sox "/Users/nexus/Desktop/dexedDevelopment/samples_dexed/${sample['filename']}" -c 1 -b 16 -L "${TMP}/${basename}.raw" + xxd -i "${TMP}/${basename}.raw" > "${TMP}/${basename}.h" + sample['len']=`grep "^unsigned int" "${TMP}/${basename}.h" | cut -d"=" -f2 | sed 's/\s*\([0-9]\+\);/\1/'` + fill_mod=`expr "${sample['len']}" % "${AUDIO_BLOCK_SIZE}"` + fill=`expr "${AUDIO_BLOCK_SIZE}" - "${fill_mod}"` + sample['len']=`expr "${sample['len']}" + "${fill}"` + sample['len']=`expr "${sample['len']}" / 2` + + echo "// Converted from ${sample['filename']}, length = ${sample['len']} bytes" >> "${DRUMSET_H}" + echo "PROGMEM const uint8_t ${sample['name']}[] = {" >> "${DRUMSET_H}" + grep "^ " "${TMP}/${basename}.h" >> "${DRUMSET_H}" + + if (( "${fill}" > 0 )) + then + echo -n "," >> "${DRUMSET_H}" + fill_counter=0 + for i in $(seq 1 "${fill}") + do + echo -n "0x00" >> "${DRUMSET_H}" + let fill_counter+=1 + if (( "${fill_counter}" >= 8 )) + then + echo "," >> "${DRUMSET_H}" + fill_counter=0 + else + echo -n ", " >> "${DRUMSET_H}" + fi + done + fi + echo "};" >> "${DRUMSET_H}" + + converted_files["${sample['filename']}"]="${sample['name']},${sample['len']}" + else + sample['data_name']=`echo ${converted_files[${sample['filename']}]} | cut -d"," -f1` + sample['len']=`echo ${converted_files[${sample['filename']}]} | cut -d"," -f2` + fi + + # Generate drums.h + cat >> "${DRUMS_H}" << EOF + { + ${sample[class]}, + ${sample[midinote]}, + "${sample[name]}", + ${sample[data_name]}, + "${sample[shortname]}", + ${sample[len]}, + ${sample[pitch]}, + ${sample[pan]}, + ${sample[vol_max]}, + ${sample[vol_min]}, + ${sample[reverb_send]} + }, +EOF + fi + else + echo "File \'${WAV_DIR}/${sample['filename']}\' does not exits." >&2 + fi +done < "${CONFIG}" + +cat >> "${DRUMS_H}" << EOF + { + DRUM_NONE, + 0, + "EMPTY", + NULL, + "-", + 0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + } +}; + +#endif +EOF diff --git a/addon/Drums/wav2sketch b/addon/Drums/wav2sketch new file mode 100644 index 0000000000000000000000000000000000000000..61d1e3e27d12dd4dcb7f3cfde94ec8dd01183b24 GIT binary patch literal 14484 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 literal 0 HcmV?d00001