sfz / opcode-suggestions

Experimental sfz opcode requests via issue tracker
3 stars 1 forks source link

Expanding the off/mute group with a new 2nd set opcodes #3

Closed kinwie closed 1 year ago

kinwie commented 4 years ago

To better mimic the real behaviour of Drums & Percussion into sampled instrument, where this type of percussive instruments sound are decaying itself interuptedly after every new hits. And for the like, cymbals/hihat, also need to be choked/muted by other articulations. So there are two decaying in its sound which are,

So in sfz programming, it is need to setup two different off_time, to prevent the unnatural build-up sound and also to have a proper choked sound

Currently, sfz has only 1 set of off/mute group opcodes, which are : group off_by off_mode off_time off_shape off_curve Those can be used to set polyphony group voicing

I suggest to add another set of opcodes for the choke needs, which are : cut_group cut_by cut_mode cut_time cut_shape cut_curve

* other than "cut", optional opcode name can be also like : mute_group, mute_by, etc. choke_group, choke_by, etc.

kinwie commented 4 years ago

I've made a wiki describe the need of this opcodes addition along with example sfz test file for demonstration of this case, in here : https://github.com/kinwie/sfztest/wiki/Test-for-the-need-of-2-different-'off_time'-for-drums

kinwie commented 4 years ago

This is an example of an existing sample player that has 2 off_time settings (rel. time)

https://user-images.githubusercontent.com/65444898/89728279-55380a00-da56-11ea-9050-b5045fe50315.png

kinwie commented 4 years ago

I agree to ARIA's alias polyphony_group for group opcode, so it's the most suitable to define polyphony group voicing. As the first post suggest 2 set off/mute group opcode, I think it is good to add 1 more as preservation for future needs or for some advanced feature combination, so we have 3 sets of off/mute group opcodes. The opcode names of the 3rd set can be, maybe : mute_group mute_by etc, or any better name.

I made an example test that includes these 3 set of opcodes. First one is used for Self-mute, with off_time at 2 seconds, to prevent the build-up effect. 2nd set is used for Choked by other key, with off_time at 0.5 seconds. 3rd set is used for Round-robin on/off toggle, with off_time at 0 seconds.

This first example will load and play and illustrate the sfz programming/design. Notice the first keyswitch example won't get choked shortly because the off_time is too long.

<global>
sample=*saw
key=48
ampeg_decay=4
ampeg_sustain=0
ampeg_release=4
note_polyphony=1
sw_lokey=36
sw_hikey=38
sw_default=36

<region>
sw_last=36
sw_label=Long, Self-mute
off_time=2
group=1
off_by=2

<region>
sw_last=37
sw_label=Short, Choked by other key
off_time=0.5
group=1
off_by=2

//-------------
<group>
sw_last=38
sw_label=Zero, For RR-on/off
off_time=0
seq_length=3

<region>
seq_position=1
region_label=RR_1
group=1
off_by=2

<region>
seq_position=2
region_label=RR_2
tune=1200
group=2
off_by=2

<region>
seq_position=3
region_label=RR_3
tune=2400
group=2
off_by=2

//===============
<global>
<region>
sample=*silence
key=50
note_polyphony=1
group=2
off_by=2

This second example won't play properly at this moment, but this is the example of the intended feature. So, the first one used polyphony_group= set of opcode. 2nd ones used cut_group= and 3rd ones used mute_group=

<global>
sample=*saw
key=48
ampeg_decay=4
ampeg_sustain=0
ampeg_release=4
note_polyphony=1
sw_lokey=36
sw_hikey=37
sw_default=36

//Long, Self-mute
polyphony_group=1
off_time=2

//Short, Choked by other key
cut_group=1
cut_by=2
cut_time=0.5

//-------------
<group>
sw_lolast=36
sw_hilast=37
sw_label=RR off

//Zero, For RR-on/off
mute_group=1
mute_by=2
mute_time=0

<region>
region_label=RR_1

//-------------
<group>
sw_last=37
sw_label=RR on
mute_group=2
seq_length=3

<region>
seq_position=2
region_label=RR_2
tune=1200

<region>
seq_position=3
region_label=RR_3
tune=2400

//===============
<global>
<region>
sample=*silence
key=50
cut_group=2
kinwie commented 3 years ago

As an alternative addition to current SFZ v2 specs, #20 seems to be simpler implemented and would have similar desired function