create a specimen (sampler) file from wave files


NOTE: there was a similar script by Florian Schmidt, but it disappeared. DEAD_LINK Does anyone still have it?


dir2beef - by Atte André Jensen


found at lau-ml, 25. April 2008 15:35

# how to use:
# put it in yout path and type the following in a terminal:

dir2beef --help


 
#!/usr/bin/env python
# -*- coding: latin-1 -*-
import os, optparse, sys, os.path, wave
 
 
parser = optparse.OptionParser()
 
if '-?' in sys.argv:
    sys.argv.remove('-?')
    sys.argv.append('-h')
 
parser.add_option('-d','--directory-containing-wavs', dest="wavDir", default='.')
parser.add_option('-l','--lowest-note-of-mapping', dest="startNote", default='36')
parser.add_option('-f','--force-overwrite', action="store_true", dest="forceOverwrite", default=False)
parser.add_option('-s','--stdout', action="store_true", dest="stdOut", default=False)
parser.add_option('-o','--outfile', dest="outFile")
(options, args) = parser.parse_args()
 
def getDir(dir):
    result = []
    import os.path
    path = os.path.abspath(dir) + '/'
    list = os.listdir(dir)
    for file in list:
        (root, ext) = os.path.splitext(file)
        if os.path.isfile(path + file) and ext in ['.wav','.WAV']:
            result.append(path + file)
    return result
 
 
 
 
 
header = """<?xml version="1.0"?>
<beef>"""
patch = """  <patch>
    <name>%s</name>
    <file>%s</file>
    <channel>0</channel>
    <note>%s</note>
    <volume>1,000000</volume>
    <pan>0,000000</pan>
    <play_mode>5</play_mode>
    <cut>0</cut>
    <cut_by>0</cut_by>
    <range>0</range>
    <lower_note>%s</lower_note>
    <upper_note>%s</upper_note>
    <sample_start>0</sample_start>
    <sample_stop>%s</sample_stop>
    <loop_start>0</loop_start>
    <loop_stop>%s</loop_stop>
    <cutoff>1,000000</cutoff>
    <resonance>0,000000</resonance>
    <pitch>0,000000</pitch>
    <pitch_steps>2</pitch_steps>
    <portamento>no</portamento>
    <portamento_time>0,050000</portamento_time>
    <monophonic>no</monophonic>
    <legato>no</legato>
    <volume_a>0,000000</volume_a>
    <volume_env_on>no</volume_env_on>
    <volume_amt>0,000000</volume_amt>
    <volume_d>0,000000</volume_d>
    <volume_s>1,000000</volume_s>
    <volume_r>0,000000</volume_r>
    <volume_delay>0,000000</volume_delay>
    <volume_hold>0,000000</volume_hold>
    <volume_lfo_amt>0,000000</volume_lfo_amt>
    <volume_lfo_on>no</volume_lfo_on>
    <volume_vel_amt>1,000000</volume_vel_amt>
    <volume_lfo_a>0,000000</volume_lfo_a>
    <volume_lfo_delay>0,000000</volume_lfo_delay>
    <volume_lfo_beats>1,000000</volume_lfo_beats>
    <volume_lfo_freq>1,000000</volume_lfo_freq>
    <volume_lfo_global>no</volume_lfo_global>
    <volume_lfo_sync>no</volume_lfo_sync>
    <volume_lfo_positive>no</volume_lfo_positive>
    <volume_lfo_shape>sine</volume_lfo_shape>
    <panning_a>0,000000</panning_a>
    <panning_env_on>no</panning_env_on>
    <panning_amt>0,000000</panning_amt>
    <panning_d>0,000000</panning_d>
    <panning_s>1,000000</panning_s>
    <panning_r>0,000000</panning_r>
    <panning_delay>0,000000</panning_delay>
    <panning_hold>0,000000</panning_hold>
    <panning_lfo_amt>0,000000</panning_lfo_amt>
    <panning_lfo_on>no</panning_lfo_on>
    <panning_vel_amt>0,000000</panning_vel_amt>
    <panning_lfo_a>0,000000</panning_lfo_a>
    <panning_lfo_delay>0,000000</panning_lfo_delay>
    <panning_lfo_beats>1,000000</panning_lfo_beats>
    <panning_lfo_freq>1,000000</panning_lfo_freq>
    <panning_lfo_global>no</panning_lfo_global>
    <panning_lfo_sync>no</panning_lfo_sync>
    <panning_lfo_positive>no</panning_lfo_positive>
    <panning_lfo_shape>sine</panning_lfo_shape>
    <cutoff_a>0,000000</cutoff_a>
    <cutoff_env_on>no</cutoff_env_on>
    <cutoff_amt>0,000000</cutoff_amt>
    <cutoff_d>0,000000</cutoff_d>
    <cutoff_s>1,000000</cutoff_s>
    <cutoff_r>0,000000</cutoff_r>
    <cutoff_delay>0,000000</cutoff_delay>
    <cutoff_hold>0,000000</cutoff_hold>
    <cutoff_lfo_amt>0,000000</cutoff_lfo_amt>
    <cutoff_lfo_on>no</cutoff_lfo_on>
    <cutoff_vel_amt>0,000000</cutoff_vel_amt>
    <cutoff_lfo_a>0,000000</cutoff_lfo_a>
    <cutoff_lfo_delay>0,000000</cutoff_lfo_delay>
    <cutoff_lfo_beats>1,000000</cutoff_lfo_beats>
    <cutoff_lfo_freq>1,000000</cutoff_lfo_freq>
    <cutoff_lfo_global>no</cutoff_lfo_global>
    <cutoff_lfo_sync>no</cutoff_lfo_sync>
    <cutoff_lfo_positive>no</cutoff_lfo_positive>
    <cutoff_lfo_shape>sine</cutoff_lfo_shape>
    <resonance_a>0,000000</resonance_a>
    <resonance_env_on>no</resonance_env_on>
    <resonance_amt>0,000000</resonance_amt>
    <resonance_d>0,000000</resonance_d>
    <resonance_s>1,000000</resonance_s>
    <resonance_r>0,000000</resonance_r>
    <resonance_delay>0,000000</resonance_delay>
    <resonance_hold>0,000000</resonance_hold>
    <resonance_lfo_amt>0,000000</resonance_lfo_amt>
    <resonance_lfo_on>no</resonance_lfo_on>
    <resonance_vel_amt>0,000000</resonance_vel_amt>
    <resonance_lfo_a>0,000000</resonance_lfo_a>
    <resonance_lfo_delay>0,000000</resonance_lfo_delay>
    <resonance_lfo_beats>1,000000</resonance_lfo_beats>
    <resonance_lfo_freq>1,000000</resonance_lfo_freq>
    <resonance_lfo_global>no</resonance_lfo_global>
    <resonance_lfo_sync>no</resonance_lfo_sync>
    <resonance_lfo_positive>no</resonance_lfo_positive>
    <resonance_lfo_shape>sine</resonance_lfo_shape>
    <pitch_a>0,000000</pitch_a>
    <pitch_env_on>no</pitch_env_on>
    <pitch_amt>0,000000</pitch_amt>
    <pitch_d>0,000000</pitch_d>
    <pitch_s>1,000000</pitch_s>
    <pitch_r>0,000000</pitch_r>
    <pitch_delay>0,000000</pitch_delay>
    <pitch_hold>0,000000</pitch_hold>
    <pitch_lfo_amt>0,000000</pitch_lfo_amt>
    <pitch_lfo_on>no</pitch_lfo_on>
    <pitch_vel_amt>0,000000</pitch_vel_amt>
    <pitch_lfo_a>0,000000</pitch_lfo_a>
    <pitch_lfo_delay>0,000000</pitch_lfo_delay>
    <pitch_lfo_beats>1,000000</pitch_lfo_beats>
    <pitch_lfo_freq>1,000000</pitch_lfo_freq>
    <pitch_lfo_global>no</pitch_lfo_global>
    <pitch_lfo_sync>no</pitch_lfo_sync>
    <pitch_lfo_positive>no</pitch_lfo_positive>
    <pitch_lfo_shape>sine</pitch_lfo_shape>
  </patch>"""
footer = "</beef>"
 
# --- the action ----
output = []
output.append(header)
note = int(options.startNote)
for file in getDir(options.wavDir):
    (head, tail) = os.path.split(file)
    (basename, ext) = os.path.splitext(tail)
    wav = wave.open(file)
    end = wav.getnframes() -1
    values = (basename,file,note, note, note, end, end)
    output.append(patch % values)
    note = note + 1
 
output.append(footer)
 
if options.stdOut == True:
    print '\n'.join(output)
    sys.exit()
 
if not options.outFile:
    options.outFile =  options.wavDir.strip('/').split('/')[-1:][0] + '.beef'
 
if not os.path.exists(options.outFile) or options.forceOverwrite:
    FILE = open(options.outFile,"w")
    for line in output:
        FILE.write(line)
else:
    print 'outfile "' + options.outFile + '" exists, use -f to force overwrite'
wiki/scripts_wav2specimen.txt · Last modified: 2013/06/02 15:45 (external edit)