Last active
September 2, 2017 16:03
-
-
Save ohac/a18b67febd73fe5f5ccb6fd811225a75 to your computer and use it in GitHub Desktop.
Creat a SFZ drums patch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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