From a18fe8f8305f8a810ef83e4430ba02d56da22c4e Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 26 Aug 2021 12:02:23 +0200 Subject: [PATCH] Started new converter tool for drumsets. --- addon/tools/convertwav.sh | 23 +++++++ addon/tools/drumset.cfg | 3 + addon/tools/wav2c.cfg | 0 addon/tools/wav2c.sh | 139 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100755 addon/tools/convertwav.sh create mode 100644 addon/tools/drumset.cfg create mode 100644 addon/tools/wav2c.cfg create mode 100755 addon/tools/wav2c.sh diff --git a/addon/tools/convertwav.sh b/addon/tools/convertwav.sh new file mode 100755 index 0000000..26a7ffb --- /dev/null +++ b/addon/tools/convertwav.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +WAV2SKETCH="${HOME}/Arduino-Teensy/MicroDexed/third-party/wav2sketch" + +if [ ! -e "${WAV2SKETCH}" ] +then + gcc "${HOME}/Arduino-Teensy/MicroDexed/third-party/wav2sketch.c" -o "${WAV2SKETCH}" + chmod 700 "${WAV2SKETCH}" +fi + +"${WAV2SKETCH}" -16 + +rm *.h +rm -f drumset.h +touch drumset.h + +for i in `ls -1 *.cpp` +do + echo "# ${i}" >> drumset.h + cat "${i}" | grep '^[A-Za-z0-9]' >> drumset.h + echo "" >> drumset.h + rm "${i}" +done diff --git a/addon/tools/drumset.cfg b/addon/tools/drumset.cfg new file mode 100644 index 0000000..7b52e97 --- /dev/null +++ b/addon/tools/drumset.cfg @@ -0,0 +1,3 @@ +# class, midinote, name, shortname, pitch, pan, vol_max, vol_min, reverb_send, filename +DRUM_BASS,MIDI_A2,Xrhitom,B,0.0,0.0,0.8,0.0,0.0,bd01.wav +DRUM_BASS,MIDI_AIS2,Vl1lbeep,B,0.0,0.0,0.8,0.0,0.0,bd02.wav diff --git a/addon/tools/wav2c.cfg b/addon/tools/wav2c.cfg new file mode 100644 index 0000000..e69de29 diff --git a/addon/tools/wav2c.sh b/addon/tools/wav2c.sh new file mode 100755 index 0000000..453bfa8 --- /dev/null +++ b/addon/tools/wav2c.sh @@ -0,0 +1,139 @@ +#!/bin/bash +# +# Converter for WAV to C Header +# Used for MicroDexed sampler +# +# (c) 2021 Holger Wirtz +# + +SOX=`which sox` +XXD=`which xxd` +TMP="/tmp/wav2c" +AUDIO_BLOCK_SIZE=128 +DRUMSET_H="drumset.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="$2" + 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}" +rm -f "${DRUMSET_H}" + +while IFS= read -r l +do + declare -A sample + + if [[ "${l:0:1}" == "#" ]] + then + continue + fi + IFS=',' read -ra samplecfg <<< "${l}" + + sample['class']="${samplecfg[0]}" + sample['midi_note']="${samplecfg[1]}" + sample['name']="${samplecfg[2]}" + sample['shortname']="${samplecfg[3]}" + sample['pitch']="${samplecfg[4]}" + sample['pan']="${samplecfg[5]}" + sample['vol_max']="${samplecfg[6]}" + sample['vol_min']="${samplecfg[7]}" + sample['reverb_send']="${samplecfg[8]}" + sample['filename']="${samplecfg[9]}" + + if [ -f "${WAV_DIR}/${sample['filename']}" ] + then + file "${WAV_DIR}/${sample['filename']}" | grep -i -q "WAVE audio" + if [ "${?}" == 0 ] + then + basename=`echo "${sample['filename']}" | cut -d'.' -f1` + sox "${WAV_DIR}/${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=`expr "${sample['len']}" % "${AUDIO_BLOCK_SIZE}"` + + echo "PROGMEM const int8_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 "};" >> /tmp/b + fi + else + echo "File \'${WAV_DIR}/${sample['filename']}\' does not exits." >&2 + fi +done < "${CONFIG}"