File size: 3,347 Bytes
b362624
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import os
from typing import List

import glob

from sfcreator.decentsampler import DecentSamplerWriter
from sfcreator.sfz import SfzWriter
from sfcreator.soundfont.soundfont import SoundFont, Sample, NoteNameMidiNumberMapper, HighLowKeyDistributor


def list_supported_files(directory):
    return glob.glob(directory + "/*.wav")


def map_note_name(note_name: str):
    if note_name.isdigit():
        return int(note_name)
    else:
        return NoteNameMidiNumberMapper().map(note_name)

# @cli.command()
# @click.argument('directory')
# @click.option('--highkey', required=False, type=str, default="108")
# @click.option('--lowkey', required=False, type=str, default="21")
# @click.option('--instrument', help="name of the instrument", required=False, type=str)
# @click.option('--loopmode',
#               help="loop mode, no_loop (default), one_shot, loop_continuous or loop_sustain,"
#                    " see https://sfzformat.com/opcodes/loop_mode",
#               required=False, type=str, default="no_loop")
# @click.option('--polyphony',
#               help="Polyphony voice limit, see https://sfzformat.com/opcodes/polyphony",
#               required=False, type=str, default=None)
def sfz(directory: str, lowkey: str, highkey: str, instrument: str, loopmode: str, polyphony: str):
    soundfont = make_soundfont(directory, map_note_name(lowkey), map_note_name(highkey), instrument, loopmode,
                               polyphony)
    SfzWriter().write(directory, soundfont)


# @cli.command()
# @click.argument('directory')
# @click.option('--highkey', required=False, type=str, default="108")
# @click.option('--lowkey', required=False, type=str, default="21")
# @click.option('--instrument', help="name of the instrument", required=False, type=str)
# @click.option('--image', required=False, type=str)
# @click.option('--loopmode',
#               help="loop mode, only supported for sfz. For compatibility reasons, --loopmode=one_shot will cause"
#                    " --release=20 for decent sampler, to ensure samples are always played until the end.",
#               required=False, type=str, default="no_loop")
# @click.option('--polyphony',
#               help="Polyphony voice limit, not supported in decent sampler format.",
#               required=False, type=str, default=None)

def decentsampler(directory: str, lowkey: str, highkey: str, instrument: str, loopmode: str, polyphony: str,
                  image: str):
    soundfont = make_soundfont(directory, map_note_name(lowkey), map_note_name(highkey), instrument, loopmode,
                               polyphony)
    DecentSamplerWriter().write(directory, soundfont, image)


def make_soundfont(directory: str, lowkey: int, highkey: int, instrument: str, loopmode: str, polyphony: str):
    files = list_supported_files(directory)
    samples: List[Sample] = []
    mapper = NoteNameMidiNumberMapper()
    for file in files:
        samples.append(mapper.mapped_sample(file))
    soundfont = SoundFont(samples, loop_mode=loopmode, polyphony=polyphony)
    if instrument is None or len(instrument) == 0:
        soundfont.instrument_name = os.path.basename(os.path.dirname(directory))
    else:
        soundfont.instrument_name = instrument
    HighLowKeyDistributor().distribute(soundfont, low_key=lowkey, high_key=highkey)
    return soundfont