Skip to content

Instantly share code, notes, and snippets.

@ohac
Last active September 2, 2017 16:03
Show Gist options
  • Select an option

  • Save ohac/a18b67febd73fe5f5ccb6fd811225a75 to your computer and use it in GitHub Desktop.

Select an option

Save ohac/a18b67febd73fe5f5ccb6fd811225a75 to your computer and use it in GitHub Desktop.
Creat a SFZ drums patch
package main
import (
"fmt"
"os"
"path"
"strings"
)
type Layer struct {
Filename string
Min float64
Max float64
RRCur int
RRTotal int
}
func NewLayer(filename string) Layer {
layer := Layer{Filename: filename, Min: 0, Max: 1, RRCur: 0, RRTotal: 1}
return layer
}
type Instrument struct {
Key int
Group int
Name string
Pan int // -100 to 100
Volume int // -144 to 6
Layer []Layer
}
func NewInstrument(key, group int, name string, pan, vol int) Instrument {
inst := Instrument{Key: key, Group: group, Name: name, Pan: pan, Volume: vol}
return inst
}
type InstrumentList struct {
Instruments []Instrument
}
type Drumkit struct {
Name string
Instruments InstrumentList
}
func NewDrumkit(name string) Drumkit {
drumkit := Drumkit{Name: name}
return drumkit
}
func (p *Drumkit) Save(filename, dpath string) {
fp, err := os.Create(filename)
if err != nil {
panic(err)
}
fmt.Fprintf(fp, "<control>\n")
fmt.Fprintf(fp, "default_path=%s\\\n", dpath)
for _, inst := range p.Instruments.Instruments {
fmt.Fprintf(fp, "<group>\n")
fmt.Fprintf(fp, "loop_mode=one_shot\n")
fmt.Fprintf(fp, "key=%d\n", inst.Key)
fmt.Fprintf(fp, "pan=%d\n", inst.Pan)
fmt.Fprintf(fp, "volume=%d\n", inst.Volume)
if inst.Group > 0 {
fmt.Fprintf(fp, "group=%d\n", inst.Group)
}
if inst.Group < 0 {
fmt.Fprintf(fp, "off_by=%d\n", -inst.Group)
fmt.Fprintf(fp, "off_mode=normal\n")
}
fmt.Fprintf(fp, "\n")
for _, layer := range inst.Layer {
fmt.Fprintf(fp, "<region>\n")
fn := layer.Filename
fn = strings.Replace(fn, "/", "\\", -1)
fmt.Fprintf(fp, "sample=%s\n", fn)
fmt.Fprintf(fp, "seq_length=%d\n", layer.RRTotal)
fmt.Fprintf(fp, "seq_position=%d\n", layer.RRCur+1)
fmt.Fprintf(fp, "lovel=%d\n", int(layer.Min*128))
fmt.Fprintf(fp, "hivel=%d\n", int(layer.Max*128)-1)
fmt.Fprintf(fp, "\n")
}
}
fp.Close()
}
func (p *Drumkit) AddMulti(key, group int, name string, filenames []string, pan, vol, rr int) {
inst := NewInstrument(key, group, name, pan, vol)
n := float64(len(filenames))
for i, filename := range filenames {
layer := NewLayer(filename)
j := i / rr
k := i % rr
min := float64(j*rr) / n
max := float64((j+1)*rr) / n
layer.Min = min
layer.Max = max
layer.RRCur = k
layer.RRTotal = rr
inst.Layer = append(inst.Layer, layer)
}
p.Instruments.Instruments = append(p.Instruments.Instruments, inst)
}
func MakePaths(instpath, fnf string, n, rr int) (wavs []string) {
wavs = make([]string, n*rr)
for i := 0; i < n; i++ {
for j := 0; j < rr; j++ {
rr2 := j + 1
wavs[i*rr+j] = path.Join(instpath, fmt.Sprintf(fnf, i+1, rr2))
}
}
return
}
type Inst struct {
key int
group int
name string
dir string
fmtf string
n int
rr int
pan int
vol int
}
func ddmfolk(base string) {
drumkit := NewDrumkit("Modern Folk")
insts := []Inst{
{35, 0, "Kick2", "Gretsch Kick/Hard Beater", "GR22_KICK_HDFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, -10},
{36, 0, "Kick", "Gretsch Kick/Soft Beater", "GR22_KICK_SFFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, -10},
{37, 0, "Side", "Ludwig 400 Snare/Sidestick", "LD400_SNR_SDFL_HT_014_V%02d_RR%02d.wav", 20, 3, 0, 0},
//{38, 0, "Snare", "Ludwig 400 Snare/Brushes", "LD400_SNR_BRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
{38, 0, "Snare", "Ludwig 400 Snare/Edge", "LD400_SNR_EGFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{38, 0, "Snare", "Ludwig 400 Snare/Hotrods", "LD400_SNR_HRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
{40, 0, "Snare", "Ludwig 400 Snare/Rimshot", "LD400_SNR_RMFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{38, 0, "Snare", "Ludwig 400 Snare/Centre", "LD400_SNR_CNFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{40, 0, "Snare2", "Ludwig Brass Shell Snare/Brushes", "LDBR_SNR_BRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{40, 0, "Snare2", "Ludwig Brass Shell Snare/Edge", "LDBR_SNR_EGFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{40, 0, "Snare2", "Ludwig Brass Shell Snare/Hotrods", "LDBR_SNR_HRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{40, 0, "Snare2", "Ludwig Brass Shell Snare/Rimshot", "LDBR_SNR_RMFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{40, 0, "Snare2", "Ludwig Brass Shell Snare/Centre", "LDBR_SNR_CNFL_HT_014_V%02d_RR%02d.wav", 24, 3, 0, 0},
//{40, 0, "Snare2", "Ludwig Brass Shell Snare/Sidestick", "LDBR_SNR_SDFL_HT_014_V%02d_RR%02d.wav", 20, 3, 0, 0},
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Brushes Closed", "ZLTR_HAT_BRCFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
{44, 1, "HH P", "Zildjian Top Rock 14 inch Hi Hats/Pedal Shut", "ZLTR_HAT_PSFL_HT_014_V%02d_RR%02d.wav", 8, 3, 5, 0},
//{44, 1, "HH PO", "Zildjian Top Rock 14 inch Hi Hats/Pedal Open", "ZLTR_HAT_POFL_HT_014_V%02d_RR%02d.wav", 4, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Brushes Open", "ZLTR_HAT_BROFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, -5}, // or 57
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Fully Closed", "ZLTR_HAT_C1FL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Closed", "ZLTR_HAT_C2FL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Open Quarter", "ZLTR_HAT_C3FL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Open Half", "ZLTR_HAT_O1FL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Open Three Quarters", "ZLTR_HAT_O2FL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Open", "ZLTR_HAT_O3FL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, -5},
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Hotrods Closed", "ZLTR_HAT_HRCFL_HT_014_V%02d_RR%02d.wav", 10, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Hotrods Open", "ZLTR_HAT_HROFL_HT_014_V%02d_RR%02d.wav", 10, 3, 5, -5}, // or 57
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Edge Fully Closed", "ZLTR_HAT_C1EGFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Edge Closed", "ZLTR_HAT_C2EGFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{42, 1, "HH C", "Zildjian Top Rock 14 inch Hi Hats/Edge Open Quarter", "ZLTR_HAT_C3EGFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Edge Open Half", "ZLTR_HAT_O1EGFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Edge Open Three Quarters", "ZLTR_HAT_O2EGFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, 0},
//{46, -1, "HH O", "Zildjian Top Rock 14 inch Hi Hats/Edge Open", "ZLTR_HAT_O3EGFL_HT_014_V%02d_RR%02d.wav", 12, 3, 5, -5},
//{41, 0, "Tom 16", "Gretsch 16 Inch Floor Tom/Brushes", "GR16_FLTM_BRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 50, -15},
//{41, 0, "Tom 16", "Gretsch 16 Inch Floor Tom/Hotrods", "GR16_FLTM_HRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 50, -15},
{41, 0, "Tom 16", "Gretsch 16 Inch Floor Tom/Centre", "GR16_FLTM_CNFL_HT_014_V%02d_RR%02d.wav", 24, 3, 50, -15},
//{43, 0, "Tom 13", "Gretsch 13 Inch Rack Tom/Brushes", "GR13_RKTM_BRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 20, -8},
//{43, 0, "Tom 13", "Gretsch 13 Inch Rack Tom/Hotrods", "GR13_RKTM_HRFL_HT_014_V%02d_RR%02d.wav", 24, 3, 20, -8},
{43, 0, "Tom 13", "Gretsch 13 Inch Rack Tom/Centre", "GR13_RKTM_CNFL_HT_014_V%02d_RR%02d.wav", 24, 3, 20, -8},
//{45, 0, "Tom 12", "Gretsch 12 Inch Rack Tom/Brushes", "GR12_RKTM_BRFL_HT_014_V%02d_RR%02d.wav", 24, 3, -20, -8}, // or 47
//{45, 0, "Tom 12", "Gretsch 12 Inch Rack Tom/Hotrods", "GR12_RKTM_HRFL_HT_014_V%02d_RR%02d.wav", 24, 3, -20, -8}, // or 47
{45, 0, "Tom 12", "Gretsch 12 Inch Rack Tom/Centre", "GR12_RKTM_CNFL_HT_014_V%02d_RR%02d.wav", 24, 3, -20, -8}, // or 47
//{48, 0, "Tom 10", "Gretsch 10 Inch Rack Tom/Brushes", "GR10_RKTM_BRFL_HT_014_V%02d_RR%02d.wav", 24, 3, -50, -13}, // or 50
//{48, 0, "Tom 10", "Gretsch 10 Inch Rack Tom/Hotrods", "GR10_RKTM_HRFL_HT_014_V%02d_RR%02d.wav", 24, 3, -50, -13}, // or 50
{48, 0, "Tom 10", "Gretsch 10 Inch Rack Tom/Centre", "GR10_RKTM_CNFL_HT_014_V%02d_RR%02d.wav", 24, 3, -50, -13}, // or 50
//{49, 0, "Crash P", "Paiste 18 Inch Crash/Brushes", "PSTE_CRSH_BRFL_HT_014_V%02d_RR%02d.wav", 10, 3, -20, -5},
{49, 0, "Crash P", "Paiste 18 Inch Crash/Edge", "PSTE_CRSH_EGFL_HT_014_V%02d_RR%02d.wav", 10, 3, -20, -5},
//{49, 0, "Crash P", "Paiste 18 Inch Crash/Hotrods", "PSTE_CRSH_HRFL_HT_014_V%02d_RR%02d.wav", 10, 3, -20, -5},
//{49, 0, "Crash P", "Paiste 18 Inch Crash/Centre", "PSTE_CRSH_CNFL_HT_014_V%02d_RR%02d.wav", 10, 3, -20, -5},
//{51, 0, "Ride", "Zildjian 20 Inch Rock Ride/Brushes", "ZLRK_RIDE_BRFL_HT_014_V%02d_RR%02d.wav", 10, 3, -10, 0},
{51, 0, "Ride", "Zildjian 20 Inch Rock Ride/Edge", "ZLRK_RIDE_EGFL_HT_014_V%02d_RR%02d.wav", 10, 3, -10, 0},
//{51, 0, "Ride", "Zildjian 20 Inch Rock Ride/Hotrods", "ZLRK_RIDE_HRFL_HT_014_V%02d_RR%02d.wav", 10, 3, -10, 0},
{53, 0, "Ride2", "Zildjian 20 Inch Rock Ride/Bell", "ZLRK_RIDE_BLFL_HT_014_V%02d_RR%02d.wav", 10, 3, -10, 0},
{59, 0, "Ride3", "Zildjian 20 Inch Rock Ride/Centre", "ZLRK_RIDE_CNFL_HT_014_V%02d_RR%02d.wav", 10, 3, -10, 0},
{54, 0, "Tambourine", "Tambourine/Shake", "TAM1_SH_HT_014_V%02d_RR%02d.wav", 5, 1, 0, 0},
{55, 0, "Tambourine", "Tambourine/Hit", "TAM1_HT_HT_014_V%02d_RR%02d.wav", 5, 1, 0, 0},
//{57, 0, "Crash Z", "Zildjian 18 inch Paper Thin Crash/Brushes", "ZLPT_CRSH_BRFL_HT_014_V%02d_RR%02d.wav", 10, 3, 20, -5},
{57, 0, "Crash Z", "Zildjian 18 inch Paper Thin Crash/Edge", "ZLPT_CRSH_EGFL_HT_014_V%02d_RR%02d.wav", 10, 3, 20, -5},
//{57, 0, "Crash Z", "Zildjian 18 inch Paper Thin Crash/Hotrods", "ZLPT_CRSH_HRFL_HT_014_V%02d_RR%02d.wav", 10, 3, 20, -5},
{50, 0, "Crash Z", "Zildjian 18 inch Paper Thin Crash/Centre", "ZLPT_CRSH_CNFL_HT_014_V%02d_RR%02d.wav", 10, 3, 20, -5},
{82, 0, "Shaker", "Shaker/Soft", "SHKR_SF_HT_014_V%02d_RR%02d.wav", 5, 1, 0, 0},
{83, 0, "Shaker", "Shaker/Hard", "SHKR_HR_HT_014_V%02d_RR%02d.wav", 5, 1, 0, 0},
}
for _, inst := range insts {
drumkit.AddMulti(inst.key, inst.group, inst.name, MakePaths(inst.dir, inst.fmtf, inst.n, inst.rr), inst.pan, inst.vol, inst.rr)
}
drumkit.Save("drumkit.sfz", base)
}
func main() {
base := "2017_06_22_Modern_Folk_Kit_MS_Pack_V1.3\\Samples"
ddmfolk(base)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment