mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
parent
12dd3dada0
commit
e5691d670a
@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
home directory of the user.
|
home directory of the user.
|
||||||
- Instrument presets. The presets are embedded in the executable and
|
- Instrument presets. The presets are embedded in the executable and
|
||||||
there's a button to open a menu to load one of the presets.
|
there's a button to open a menu to load one of the presets.
|
||||||
|
- Frequency modulation target for oscillator, as it was in 4klang
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- The sointu-vsti-native plugin has different plugin ID and plugin name
|
- The sointu-vsti-native plugin has different plugin ID and plugin name
|
||||||
|
@ -124,6 +124,8 @@ regression_test(test_oscillat_colormod "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND
|
|||||||
regression_test(test_oscillat_shapemod "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND")
|
regression_test(test_oscillat_shapemod "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND")
|
||||||
regression_test(test_oscillat_gainmod OSCGAINMOD "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND")
|
regression_test(test_oscillat_gainmod OSCGAINMOD "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND")
|
||||||
regression_test(test_oscillat_gainmod_stereo "" OSCGAINMOD)
|
regression_test(test_oscillat_gainmod_stereo "" OSCGAINMOD)
|
||||||
|
regression_test(test_oscillat_frequencymod "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND")
|
||||||
|
regression_test(test_oscillat_frequencymod_stereo "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND")
|
||||||
|
|
||||||
regression_test(test_distort ENVELOPE)
|
regression_test(test_distort ENVELOPE)
|
||||||
regression_test(test_distort_mod "VCO_SINE;ENVELOPE;SEND")
|
regression_test(test_distort_mod "VCO_SINE;ENVELOPE;SEND")
|
||||||
|
BIN
tests/expected_output/test_oscillat_frequencymod.raw
Normal file
BIN
tests/expected_output/test_oscillat_frequencymod.raw
Normal file
Binary file not shown.
BIN
tests/expected_output/test_oscillat_frequencymod_stereo.raw
Normal file
BIN
tests/expected_output/test_oscillat_frequencymod_stereo.raw
Normal file
Binary file not shown.
27
tests/test_oscillat_frequencymod.yml
Normal file
27
tests/test_oscillat_frequencymod.yml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
bpm: 100
|
||||||
|
rowsperbeat: 4
|
||||||
|
score:
|
||||||
|
rowsperpattern: 16
|
||||||
|
length: 1
|
||||||
|
tracks:
|
||||||
|
- numvoices: 1
|
||||||
|
order: [0]
|
||||||
|
patterns: [[80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
|
||||||
|
patch:
|
||||||
|
- numvoices: 1
|
||||||
|
units:
|
||||||
|
- type: envelope
|
||||||
|
parameters: {attack: 80, decay: 80, gain: 128, release: 80, stereo: 0, sustain: 64}
|
||||||
|
- type: oscillator
|
||||||
|
parameters: {color: 128, detune: 64, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 0, unison: 0}
|
||||||
|
id: 1
|
||||||
|
- type: mulp
|
||||||
|
parameters: {stereo: 0}
|
||||||
|
- type: push
|
||||||
|
parameters: {stereo: 0}
|
||||||
|
- type: oscillator
|
||||||
|
parameters: {color: 128, detune: 64, gain: 128, lfo: 1, phase: 64, shape: 64, stereo: 0, transpose: 70, type: 0, unison: 0}
|
||||||
|
- type: send
|
||||||
|
parameters: {amount: 68, port: 6, sendpop: 1, stereo: 0, target: 1}
|
||||||
|
- type: out
|
||||||
|
parameters: {gain: 128, stereo: 1}
|
27
tests/test_oscillat_frequencymod_stereo.yml
Normal file
27
tests/test_oscillat_frequencymod_stereo.yml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
bpm: 100
|
||||||
|
rowsperbeat: 4
|
||||||
|
score:
|
||||||
|
rowsperpattern: 16
|
||||||
|
length: 1
|
||||||
|
tracks:
|
||||||
|
- numvoices: 1
|
||||||
|
order: [0]
|
||||||
|
patterns: [[80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]]
|
||||||
|
patch:
|
||||||
|
- numvoices: 1
|
||||||
|
units:
|
||||||
|
- type: envelope
|
||||||
|
parameters: {attack: 80, decay: 80, gain: 128, release: 80, stereo: 0, sustain: 64}
|
||||||
|
- type: push
|
||||||
|
parameters: {stereo: 0}
|
||||||
|
- type: oscillator
|
||||||
|
parameters: {color: 128, detune: 64, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 64, type: 0, unison: 0}
|
||||||
|
id: 1
|
||||||
|
- type: mulp
|
||||||
|
parameters: {stereo: 1}
|
||||||
|
- type: oscillator
|
||||||
|
parameters: {color: 128, detune: 64, gain: 128, lfo: 1, phase: 64, shape: 64, stereo: 0, transpose: 70, type: 0, unison: 0}
|
||||||
|
- type: send
|
||||||
|
parameters: {amount: 68, port: 6, sendpop: 1, stereo: 0, target: 1}
|
||||||
|
- type: out
|
||||||
|
parameters: {gain: 128, stereo: 1}
|
@ -105,6 +105,7 @@ var UnitTypes = map[string]([]UnitParameter){
|
|||||||
{Name: "color", MinValue: 0, MaxValue: 128, CanSet: true, CanModulate: true},
|
{Name: "color", MinValue: 0, MaxValue: 128, CanSet: true, CanModulate: true},
|
||||||
{Name: "shape", MinValue: 0, MaxValue: 128, CanSet: true, CanModulate: true},
|
{Name: "shape", MinValue: 0, MaxValue: 128, CanSet: true, CanModulate: true},
|
||||||
{Name: "gain", MinValue: 0, MaxValue: 128, CanSet: true, CanModulate: true},
|
{Name: "gain", MinValue: 0, MaxValue: 128, CanSet: true, CanModulate: true},
|
||||||
|
{Name: "frequency", MinValue: 0, MaxValue: -1, CanSet: false, CanModulate: true},
|
||||||
{Name: "type", MinValue: int(Sine), MaxValue: int(Sample), CanSet: true, CanModulate: false},
|
{Name: "type", MinValue: int(Sine), MaxValue: int(Sample), CanSet: true, CanModulate: false},
|
||||||
{Name: "lfo", MinValue: 0, MaxValue: 1, CanSet: true, CanModulate: false},
|
{Name: "lfo", MinValue: 0, MaxValue: 1, CanSet: true, CanModulate: false},
|
||||||
{Name: "unison", MinValue: 0, MaxValue: 3, CanSet: true, CanModulate: false},
|
{Name: "unison", MinValue: 0, MaxValue: 3, CanSet: true, CanModulate: false},
|
||||||
|
@ -99,6 +99,11 @@ su_op_noise_mono:
|
|||||||
; Stereo: push l r on stack, where l has opposite detune compared to r
|
; Stereo: push l r on stack, where l has opposite detune compared to r
|
||||||
;-------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------
|
||||||
{{.Func "su_op_oscillator" "Opcode"}}
|
{{.Func "su_op_oscillator" "Opcode"}}
|
||||||
|
{{- if .SupportsModulation "oscillator" "frequency"}}
|
||||||
|
push 0
|
||||||
|
pop {{.CX}} ; clear cx without affecting flags
|
||||||
|
xchg ecx, dword [{{.Modulation "oscillator" "frequency"}}]
|
||||||
|
{{- end}}
|
||||||
lodsb ; load the flags
|
lodsb ; load the flags
|
||||||
{{- if .Library}}
|
{{- if .Library}}
|
||||||
mov {{.DI}}, [{{.Stack "SampleTable"}}]; we need to put this in a register, as the stereo & unisons screw the stack positions
|
mov {{.DI}}, [{{.Stack "SampleTable"}}]; we need to put this in a register, as the stereo & unisons screw the stack positions
|
||||||
@ -175,6 +180,11 @@ su_op_oscillat_normalize_note:
|
|||||||
fmul dword [{{.Float 0.000092696138 | .Use}}] ; // st0 is now frequency
|
fmul dword [{{.Float 0.000092696138 | .Use}}] ; // st0 is now frequency
|
||||||
su_op_oscillat_normalized:
|
su_op_oscillat_normalized:
|
||||||
fadd dword [{{.WRK}}]
|
fadd dword [{{.WRK}}]
|
||||||
|
{{- if .SupportsModulation "oscillator" "frequency"}}
|
||||||
|
push {{.CX}}
|
||||||
|
fadd dword [{{.SP}}]
|
||||||
|
pop {{.CX}}
|
||||||
|
{{- end}}
|
||||||
{{- if .SupportsParamValue "oscillator" "type" .Sample}}
|
{{- if .SupportsParamValue "oscillator" "type" .Sample}}
|
||||||
test al, byte 0x80
|
test al, byte 0x80
|
||||||
jz short su_op_oscillat_not_sample
|
jz short su_op_oscillat_not_sample
|
||||||
|
@ -107,9 +107,16 @@
|
|||||||
{{- if .SupportsParamValueOtherThan "oscillator" "unison" 0}}
|
{{- if .SupportsParamValueOtherThan "oscillator" "unison" 0}}
|
||||||
(local $unison i32) (local $WRK_stash i32) (local $detune_stash f32)
|
(local $unison i32) (local $WRK_stash i32) (local $detune_stash f32)
|
||||||
{{- end}}
|
{{- end}}
|
||||||
|
{{- if .SupportsModulation "oscillator" "frequency"}}
|
||||||
|
(local $freqMod f32)
|
||||||
|
{{- end}}
|
||||||
{{- if .Stereo "oscillator"}}
|
{{- if .Stereo "oscillator"}}
|
||||||
(local $WRK_stereostash i32)
|
(local $WRK_stereostash i32)
|
||||||
(local.set $WRK_stereostash (global.get $WRK))
|
(local.set $WRK_stereostash (global.get $WRK))
|
||||||
|
{{- end}}
|
||||||
|
{{- if .SupportsModulation "oscillator" "frequency"}}
|
||||||
|
(local.set $freqMod (f32.load offset={{.InputNumber "oscillator" "frequency" | mul 4 | add 32}} (global.get $WRK)))
|
||||||
|
(f32.store offset={{.InputNumber "oscillator" "frequency" | mul 4 | add 32}} (global.get $WRK) (f32.const 0))
|
||||||
{{- end}}
|
{{- end}}
|
||||||
(local.set $flags (call $scanValueByte))
|
(local.set $flags (call $scanValueByte))
|
||||||
(local.set $detune (call $inputSigned (i32.const {{.InputNumber "oscillator" "detune"}})))
|
(local.set $detune (call $inputSigned (i32.const {{.InputNumber "oscillator" "detune"}})))
|
||||||
@ -146,6 +153,9 @@
|
|||||||
(f32.const 0.000092696138) ;; scaling constant to get middle-C to where it should be
|
(f32.const 0.000092696138) ;; scaling constant to get middle-C to where it should be
|
||||||
(i32.and (local.get $flags) (i32.const 0x8))
|
(i32.and (local.get $flags) (i32.const 0x8))
|
||||||
))
|
))
|
||||||
|
{{- if .SupportsModulation "oscillator" "frequency"}}
|
||||||
|
(f32.add (local.get $freqMod))
|
||||||
|
{{- end}}
|
||||||
(f32.add (f32.load (global.get $WRK))) ;; add the current phase of the oscillator
|
(f32.add (f32.load (global.get $WRK))) ;; add the current phase of the oscillator
|
||||||
)
|
)
|
||||||
(f32.floor (local.get $phase))
|
(f32.floor (local.get $phase))
|
||||||
|
@ -454,6 +454,7 @@ func (s *Interpreter) Render(buffer []float32, maxtime int) (samples int, time i
|
|||||||
} else {
|
} else {
|
||||||
omega *= 0.000038 // pretty random scaling constant to get LFOs into reasonable range. Historical reasons, goes all the way back to 4klang
|
omega *= 0.000038 // pretty random scaling constant to get LFOs into reasonable range. Historical reasons, goes all the way back to 4klang
|
||||||
}
|
}
|
||||||
|
omega += float64(unit.ports[6]) // add frequency modulation
|
||||||
var amplitude float32
|
var amplitude float32
|
||||||
*statevar += float32(omega)
|
*statevar += float32(omega)
|
||||||
if flags&0x80 == 0x80 { // if this is a sample oscillator
|
if flags&0x80 == 0x80 { // if this is a sample oscillator
|
||||||
@ -515,6 +516,7 @@ func (s *Interpreter) Render(buffer []float32, maxtime int) (samples int, time i
|
|||||||
stack = append(stack, output)
|
stack = append(stack, output)
|
||||||
detuneStereo = -detuneStereo
|
detuneStereo = -detuneStereo
|
||||||
}
|
}
|
||||||
|
unit.ports[6] = 0
|
||||||
case opDelay:
|
case opDelay:
|
||||||
pregain2 := params[0] * params[0]
|
pregain2 := params[0] * params[0]
|
||||||
damp := params[3]
|
damp := params[3]
|
||||||
|
Loading…
Reference in New Issue
Block a user