From b5bf0edfb46c2fc5059bc542c9568adb9f83f2ba Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 26 Aug 2021 13:54:01 +0200 Subject: [PATCH] First version of wav2c is ready. --- addon/SD/drm/convertwav.sh | 23 ---------- addon/tools/wav2c.sh | 91 +++++++++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 25 deletions(-) delete mode 100755 addon/SD/drm/convertwav.sh diff --git a/addon/SD/drm/convertwav.sh b/addon/SD/drm/convertwav.sh deleted file mode 100755 index 26a7ffb..0000000 --- a/addon/SD/drm/convertwav.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/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/wav2c.sh b/addon/tools/wav2c.sh index 453bfa8..6c4fd59 100755 --- a/addon/tools/wav2c.sh +++ b/addon/tools/wav2c.sh @@ -11,6 +11,7 @@ XXD=`which xxd` TMP="/tmp/wav2c" AUDIO_BLOCK_SIZE=128 DRUMSET_H="drumset.h" +DRUMS_H="drums.h" function cleanexit() { @@ -78,6 +79,64 @@ fi mkdir -p "${TMP}" rm -f "${DRUMSET_H}" +touch 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 unsigned int* 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 while IFS= read -r l do @@ -90,7 +149,7 @@ do IFS=',' read -ra samplecfg <<< "${l}" sample['class']="${samplecfg[0]}" - sample['midi_note']="${samplecfg[1]}" + sample['midinote']="${samplecfg[1]}" sample['name']="${samplecfg[2]}" sample['shortname']="${samplecfg[3]}" sample['pitch']="${samplecfg[4]}" @@ -105,12 +164,17 @@ do file "${WAV_DIR}/${sample['filename']}" | grep -i -q "WAVE audio" if [ "${?}" == 0 ] then + # Generate drumset.h + 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}"` + fill_mod=`expr "${sample['len']}" % "${AUDIO_BLOCK_SIZE}"` + fill=`expr "${AUDIO_BLOCK_SIZE}" - "${fill_mod}"` + sample['len']=`expr "${sample['len']}" + "${fill}"` + echo "// Converted from ${sample['filename']}, length = ${sample['len']} bytes" >> "${DRUMSET_H}" echo "PROGMEM const int8_t ${sample['name']}[] = {" >> "${DRUMSET_H}" grep "^ " "${TMP}/${basename}.h" >> "${DRUMSET_H}" @@ -132,8 +196,31 @@ do done fi echo "};" >> /tmp/b + + # Generate drums.h + cat >> "${DRUMS_H}" << EOF + { + ${sample[class]}, + ${sample[midinote]}, + "${sample[name]}", + ${sample[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 +}; + +#endif +EOF