Skip to content

Commit 02240be

Browse files
authored
Merge pull request #3 from heucuva/reintregrate-voice
Reintegrate voice package back into playback
2 parents 13f50dc + fcc3cae commit 02240be

File tree

109 files changed

+2937
-682
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+2937
-682
lines changed

channel.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import (
44
"github.com/gotracker/gomixing/panning"
55
"github.com/gotracker/gomixing/sampling"
66
"github.com/gotracker/gomixing/volume"
7-
"github.com/gotracker/voice"
7+
"github.com/gotracker/playback/period"
8+
"github.com/gotracker/playback/voice"
89

910
"github.com/gotracker/playback/instrument"
1011
"github.com/gotracker/playback/note"
@@ -21,15 +22,15 @@ type Channel[TMemory, TChannelData any] interface {
2122
FreezePlayback()
2223
UnfreezePlayback()
2324
GetData() *TChannelData
24-
GetPortaTargetPeriod() note.Period
25-
SetPortaTargetPeriod(note.Period)
26-
GetTargetPeriod() note.Period
27-
SetTargetPeriod(note.Period)
28-
SetPeriodOverride(note.Period)
29-
GetPeriod() note.Period
30-
SetPeriod(note.Period)
31-
SetPeriodDelta(note.PeriodDelta)
32-
GetPeriodDelta() note.PeriodDelta
25+
GetPortaTargetPeriod() period.Period
26+
SetPortaTargetPeriod(period.Period)
27+
GetTargetPeriod() period.Period
28+
SetTargetPeriod(period.Period)
29+
SetPeriodOverride(period.Period)
30+
GetPeriod() period.Period
31+
SetPeriod(period.Period)
32+
SetPeriodDelta(period.PeriodDelta)
33+
GetPeriodDelta() period.PeriodDelta
3334
SetInstrument(*instrument.Instrument)
3435
GetInstrument() *instrument.Instrument
3536
GetVoice() voice.Voice

filter/amigafilter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"math"
55

66
"github.com/gotracker/gomixing/volume"
7-
"github.com/gotracker/voice/period"
7+
"github.com/gotracker/playback/period"
88
)
99

1010
type channelData struct {

filter/echofilter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package filter
33
import (
44
"math"
55

6-
"github.com/gotracker/voice/period"
6+
"github.com/gotracker/playback/period"
77

88
"github.com/gotracker/gomixing/volume"
99
)

filter/filter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package filter
22

33
import (
44
"github.com/gotracker/gomixing/volume"
5-
"github.com/gotracker/voice/period"
5+
"github.com/gotracker/playback/period"
66
)
77

88
// Filter is an interface to a filter

format/it/channel/memory.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package channel
22

33
import (
4-
"github.com/gotracker/voice/oscillator"
4+
"github.com/gotracker/playback/voice/oscillator"
55

66
"github.com/gotracker/playback/memory"
77
oscillatorImpl "github.com/gotracker/playback/oscillator"

format/it/load/instrument.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import (
1010
itfile "github.com/gotracker/goaudiofile/music/tracked/it"
1111
"github.com/gotracker/gomixing/panning"
1212
"github.com/gotracker/gomixing/volume"
13-
"github.com/gotracker/voice"
14-
"github.com/gotracker/voice/envelope"
15-
"github.com/gotracker/voice/fadeout"
16-
"github.com/gotracker/voice/loop"
17-
"github.com/gotracker/voice/oscillator"
18-
"github.com/gotracker/voice/pcm"
19-
"github.com/gotracker/voice/period"
13+
"github.com/gotracker/playback/period"
14+
"github.com/gotracker/playback/voice"
15+
"github.com/gotracker/playback/voice/envelope"
16+
"github.com/gotracker/playback/voice/fadeout"
17+
"github.com/gotracker/playback/voice/loop"
18+
"github.com/gotracker/playback/voice/oscillator"
19+
"github.com/gotracker/playback/voice/pcm"
2020

2121
"github.com/gotracker/playback/filter"
2222
itNote "github.com/gotracker/playback/format/it/note"
@@ -442,7 +442,7 @@ func addSampleInfoToConvertedInstrument(ii *instrument.Instrument, id *instrumen
442442

443443
ii.Static.Filename = si.Header.GetFilename()
444444
ii.Static.Name = si.Header.GetName()
445-
ii.C2Spd = note.C2SPD(si.Header.C5Speed)
445+
ii.C2Spd = period.Frequency(si.Header.C5Speed)
446446
ii.Static.AutoVibrato = voice.AutoVibrato{
447447
Enabled: (si.Header.VibratoDepth != 0 && si.Header.VibratoSpeed != 0 && si.Header.VibratoSweep != 0),
448448
Sweep: 255,

format/it/period/amiga.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ import (
55
"math"
66

77
"github.com/gotracker/playback/note"
8-
per "github.com/gotracker/playback/period"
98
"github.com/heucuva/comparison"
109

11-
"github.com/gotracker/voice/period"
10+
"github.com/gotracker/playback/period"
1211
)
1312

1413
// Amiga defines a sampler period that follows the Amiga-style approach of note
1514
// definition. Useful in calculating resampling.
16-
type Amiga per.AmigaPeriod
15+
type Amiga period.AmigaPeriod
1716

1817
// AddInteger truncates the current period to an integer and adds the delta integer in
1918
// then returns the resulting period
@@ -24,17 +23,16 @@ func (p Amiga) AddInteger(delta int) Amiga {
2423

2524
// Add adds the current period to a delta value then returns the resulting period
2625
func (p Amiga) AddDelta(delta period.Delta) period.Period {
27-
period := p
28-
d := note.ToPeriodDelta(delta)
29-
period += Amiga(d)
30-
return period
26+
d := period.ToPeriodDelta(delta)
27+
p += Amiga(d)
28+
return p
3129
}
3230

3331
// Compare returns:
3432
// -1 if the current period is higher frequency than the `rhs` period
3533
// 0 if the current period is equal in frequency to the `rhs` period
3634
// 1 if the current period is lower frequency than the `rhs` period
37-
func (p Amiga) Compare(rhs note.Period) comparison.Spaceship {
35+
func (p Amiga) Compare(rhs period.Period) comparison.Spaceship {
3836
lf := p.GetFrequency()
3937
rf := rhs.GetFrequency()
4038

@@ -49,32 +47,32 @@ func (p Amiga) Compare(rhs note.Period) comparison.Spaceship {
4947
}
5048

5149
// Lerp linear-interpolates the current period with the `rhs` period
52-
func (p Amiga) Lerp(t float64, rhs note.Period) note.Period {
50+
func (p Amiga) Lerp(t float64, rhs period.Period) period.Period {
5351
right := Amiga(0)
5452
if r, ok := rhs.(Amiga); ok {
5553
right = r
5654
}
5755

58-
period := Amiga(per.AmigaPeriod(p).Lerp(t, per.AmigaPeriod(right)))
56+
period := Amiga(period.AmigaPeriod(p).Lerp(t, period.AmigaPeriod(right)))
5957
return period
6058
}
6159

6260
// GetSamplerAdd returns the number of samples to advance an instrument by given the period
6361
func (p Amiga) GetSamplerAdd(samplerSpeed float64) float64 {
64-
return float64(per.AmigaPeriod(p).GetFrequency(period.Frequency(samplerSpeed)))
62+
return float64(period.AmigaPeriod(p).GetFrequency(period.Frequency(samplerSpeed)))
6563
}
6664

6765
// GetFrequency returns the frequency defined by the period
6866
func (p Amiga) GetFrequency() period.Frequency {
69-
return per.AmigaPeriod(p).GetFrequency(period.Frequency(ITBaseClock))
67+
return period.AmigaPeriod(p).GetFrequency(period.Frequency(ITBaseClock))
7068
}
7169

7270
func (p Amiga) String() string {
7371
return fmt.Sprintf("Amiga{ Period:%f }", float32(p))
7472
}
7573

7674
// ToAmigaPeriod calculates an amiga period for a linear finetune period
77-
func ToAmigaPeriod(finetunes note.Finetune, c2spd note.C2SPD) Amiga {
75+
func ToAmigaPeriod(finetunes note.Finetune, c2spd period.Frequency) Amiga {
7876
if finetunes < 0 {
7977
finetunes = 0
8078
}

format/it/period/linear.go

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,33 @@ import (
77
"github.com/gotracker/playback/note"
88
"github.com/heucuva/comparison"
99

10-
"github.com/gotracker/voice/period"
10+
"github.com/gotracker/playback/period"
1111
)
1212

1313
// Linear is a linear period, based on semitone and finetune values
1414
type Linear struct {
1515
Finetune note.Finetune
16-
C2Spd note.C2SPD
16+
C2Spd period.Frequency
1717
}
1818

1919
// Add adds the current period to a delta value then returns the resulting period
2020
func (p Linear) AddDelta(delta period.Delta) period.Period {
21-
period := p
2221
// 0 means "not playing", so keep it that way
23-
if period.Finetune > 0 {
24-
d := note.ToPeriodDelta(delta)
25-
period.Finetune += note.Finetune(d)
26-
if period.Finetune < 1 {
27-
period.Finetune = 1
22+
if p.Finetune > 0 {
23+
d := period.ToPeriodDelta(delta)
24+
p.Finetune += note.Finetune(d)
25+
if p.Finetune < 1 {
26+
p.Finetune = 1
2827
}
2928
}
30-
return period
29+
return p
3130
}
3231

3332
// Compare returns:
3433
// -1 if the current period is higher frequency than the `rhs` period
3534
// 0 if the current period is equal in frequency to the `rhs` period
3635
// 1 if the current period is lower frequency than the `rhs` period
37-
func (p Linear) Compare(rhs note.Period) comparison.Spaceship {
36+
func (p Linear) Compare(rhs period.Period) comparison.Spaceship {
3837
lf := p.GetFrequency()
3938
rf := rhs.GetFrequency()
4039

@@ -49,26 +48,20 @@ func (p Linear) Compare(rhs note.Period) comparison.Spaceship {
4948
}
5049

5150
// Lerp linear-interpolates the current period with the `rhs` period
52-
func (p Linear) Lerp(t float64, rhs note.Period) note.Period {
51+
func (p Linear) Lerp(t float64, rhs period.Period) period.Period {
5352
right := ToLinearPeriod(rhs)
5453

55-
period := p
56-
57-
lnft := float64(period.Finetune)
54+
lnft := float64(p.Finetune)
5855
rnft := float64(right.Finetune)
5956

60-
delta := note.PeriodDelta(t * (rnft - lnft))
61-
period.AddDelta(delta)
62-
return period
57+
delta := period.PeriodDelta(t * (rnft - lnft))
58+
p.AddDelta(delta)
59+
return p
6360
}
6461

6562
// GetSamplerAdd returns the number of samples to advance an instrument by given the period
6663
func (p Linear) GetSamplerAdd(samplerSpeed float64) float64 {
67-
period := float64(ToAmigaPeriod(p.Finetune, p.C2Spd))
68-
if period == 0 {
69-
return 0
70-
}
71-
return samplerSpeed / period
64+
return ToAmigaPeriod(p.Finetune, p.C2Spd).GetSamplerAdd(samplerSpeed)
7265
}
7366

7467
// GetFrequency returns the frequency defined by the period
@@ -82,7 +75,7 @@ func (p Linear) String() string {
8275
}
8376

8477
// ToLinearPeriod returns the linear frequency period for a given period
85-
func ToLinearPeriod(p note.Period) Linear {
78+
func ToLinearPeriod(p period.Period) Linear {
8679
switch pp := p.(type) {
8780
case Linear:
8881
return pp

format/it/period/util.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package period
22

33
import (
44
"github.com/gotracker/playback/note"
5-
"github.com/gotracker/voice/period"
5+
"github.com/gotracker/playback/period"
66
)
77

88
const (
@@ -24,7 +24,7 @@ const (
2424
var semitonePeriodTable = [...]float32{27392, 25856, 24384, 23040, 21696, 20480, 19328, 18240, 17216, 16256, 15360, 14496}
2525

2626
// CalcSemitonePeriod calculates the semitone period for it notes
27-
func CalcSemitonePeriod(semi note.Semitone, ft note.Finetune, c2spd note.C2SPD, linearFreqSlides bool) note.Period {
27+
func CalcSemitonePeriod(semi note.Semitone, ft note.Finetune, c2spd period.Frequency, linearFreqSlides bool) period.Period {
2828
if semi == note.UnchangedSemitone {
2929
panic("how?")
3030
}
@@ -46,7 +46,7 @@ func CalcSemitonePeriod(semi note.Semitone, ft note.Finetune, c2spd note.C2SPD,
4646
}
4747

4848
if c2spd == 0 {
49-
c2spd = note.C2SPD(DefaultC2Spd)
49+
c2spd = period.Frequency(DefaultC2Spd)
5050
}
5151

5252
if ft != 0 {
@@ -59,18 +59,18 @@ func CalcSemitonePeriod(semi note.Semitone, ft note.Finetune, c2spd note.C2SPD,
5959
}
6060

6161
// CalcFinetuneC2Spd calculates a new C2SPD after a finetune adjustment
62-
func CalcFinetuneC2Spd(c2spd note.C2SPD, finetune note.Finetune, linearFreqSlides bool) note.C2SPD {
62+
func CalcFinetuneC2Spd(c2spd period.Frequency, finetune note.Finetune, linearFreqSlides bool) period.Frequency {
6363
if finetune == 0 {
6464
return c2spd
6565
}
6666

6767
nft := 5*semitonesPerOctave + int(finetune)
6868
p := CalcSemitonePeriod(note.Semitone(nft/semitonesPerNote), note.Finetune(nft%semitonesPerNote), c2spd, linearFreqSlides)
69-
return note.C2SPD(p.GetFrequency())
69+
return period.Frequency(p.GetFrequency())
7070
}
7171

7272
// FrequencyFromSemitone returns the frequency from the semitone (and c2spd)
73-
func FrequencyFromSemitone(semitone note.Semitone, c2spd note.C2SPD, linearFreqSlides bool) float32 {
73+
func FrequencyFromSemitone(semitone note.Semitone, c2spd period.Frequency, linearFreqSlides bool) float32 {
7474
p := CalcSemitonePeriod(semitone, 0, c2spd, linearFreqSlides)
7575
return float32(p.GetFrequency())
7676
}

format/it/playback/effect/effect_portatonote.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/gotracker/playback"
77
"github.com/gotracker/playback/format/it/channel"
88
"github.com/gotracker/playback/note"
9+
"github.com/gotracker/playback/period"
910
"github.com/heucuva/comparison"
1011
)
1112

@@ -29,14 +30,14 @@ func (e PortaToNote) Tick(cs playback.Channel[channel.Memory, channel.Data], p p
2930
xx := mem.PortaToNote(channel.DataEffect(e))
3031

3132
// vibrato modifies current period for portamento
32-
period := cs.GetPeriod()
33-
if period == nil {
33+
cur := cs.GetPeriod()
34+
if cur == nil {
3435
return nil
3536
}
36-
period = period.AddDelta(cs.GetPeriodDelta()).(note.Period)
37+
cur = cur.AddDelta(cs.GetPeriodDelta())
3738
ptp := cs.GetPortaTargetPeriod()
3839
if !mem.Shared.OldEffectMode || currentTick != 0 {
39-
if note.ComparePeriods(period, ptp) == comparison.SpaceshipRightGreater {
40+
if period.ComparePeriods(cur, ptp) == comparison.SpaceshipRightGreater {
4041
return doPortaUpToNote(cs, float32(xx), 4, ptp, mem.Shared.LinearFreqSlides) // subtracts
4142
} else {
4243
return doPortaDownToNote(cs, float32(xx), 4, ptp, mem.Shared.LinearFreqSlides) // adds

0 commit comments

Comments
 (0)