// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT.
import (
"github.com/kaitai-io/kaitai_struct_go_runtime/kaitai"
"bytes"
)
/**
* GENMIDI.OP2 is a sound bank file used by players based on DMX sound
* library to play MIDI files with General MIDI instruments using OPL2
* sound chip (which was commonly installed on popular AdLib and Sound
* Blaster sound cards).
*
* Major users of DMX sound library include:
*
* * Original Doom game engine (and games based on it: Heretic, Hexen, Strife, Chex Quest)
* * Raptor: Call of the Shadows
* @see Source
* @see Source
* @see Source
*/
type GenmidiOp2 struct {
Magic []byte
Instruments []*GenmidiOp2_InstrumentEntry
InstrumentNames []string
_io *kaitai.Stream
_root *GenmidiOp2
_parent interface{}
}
func NewGenmidiOp2() *GenmidiOp2 {
return &GenmidiOp2{
}
}
func (this *GenmidiOp2) Read(io *kaitai.Stream, parent interface{}, root *GenmidiOp2) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp1, err := this._io.ReadBytes(int(8))
if err != nil {
return err
}
tmp1 = tmp1
this.Magic = tmp1
if !(bytes.Equal(this.Magic, []uint8{35, 79, 80, 76, 95, 73, 73, 35})) {
return kaitai.NewValidationNotEqualError([]uint8{35, 79, 80, 76, 95, 73, 73, 35}, this.Magic, this._io, "/seq/0")
}
for i := 0; i < int(175); i++ {
_ = i
tmp2 := NewGenmidiOp2_InstrumentEntry()
err = tmp2.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Instruments = append(this.Instruments, tmp2)
}
for i := 0; i < int(175); i++ {
_ = i
tmp3, err := this._io.ReadBytes(int(32))
if err != nil {
return err
}
tmp3 = kaitai.BytesTerminate(kaitai.BytesStripRight(tmp3, 0), 0, false)
this.InstrumentNames = append(this.InstrumentNames, string(tmp3))
}
return err
}
type GenmidiOp2_InstrumentEntry struct {
Flags uint16
Finetune uint8
Note uint8
Instruments []*GenmidiOp2_Instrument
_io *kaitai.Stream
_root *GenmidiOp2
_parent *GenmidiOp2
}
func NewGenmidiOp2_InstrumentEntry() *GenmidiOp2_InstrumentEntry {
return &GenmidiOp2_InstrumentEntry{
}
}
func (this *GenmidiOp2_InstrumentEntry) Read(io *kaitai.Stream, parent *GenmidiOp2, root *GenmidiOp2) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp4, err := this._io.ReadU2le()
if err != nil {
return err
}
this.Flags = uint16(tmp4)
tmp5, err := this._io.ReadU1()
if err != nil {
return err
}
this.Finetune = tmp5
tmp6, err := this._io.ReadU1()
if err != nil {
return err
}
this.Note = tmp6
for i := 0; i < int(2); i++ {
_ = i
tmp7 := NewGenmidiOp2_Instrument()
err = tmp7.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Instruments = append(this.Instruments, tmp7)
}
return err
}
/**
* MIDI note for fixed instruments, 0 otherwise
*/
type GenmidiOp2_Instrument struct {
Op1 *GenmidiOp2_OpSettings
Feedback uint8
Op2 *GenmidiOp2_OpSettings
Unused uint8
BaseNote int16
_io *kaitai.Stream
_root *GenmidiOp2
_parent *GenmidiOp2_InstrumentEntry
}
func NewGenmidiOp2_Instrument() *GenmidiOp2_Instrument {
return &GenmidiOp2_Instrument{
}
}
func (this *GenmidiOp2_Instrument) Read(io *kaitai.Stream, parent *GenmidiOp2_InstrumentEntry, root *GenmidiOp2) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp8 := NewGenmidiOp2_OpSettings()
err = tmp8.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Op1 = tmp8
tmp9, err := this._io.ReadU1()
if err != nil {
return err
}
this.Feedback = tmp9
tmp10 := NewGenmidiOp2_OpSettings()
err = tmp10.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Op2 = tmp10
tmp11, err := this._io.ReadU1()
if err != nil {
return err
}
this.Unused = tmp11
tmp12, err := this._io.ReadS2le()
if err != nil {
return err
}
this.BaseNote = int16(tmp12)
return err
}
/**
* Feedback/AM-FM (both operators)
*/
/**
* Base note offset
*/
/**
* OPL2 settings for one operator (carrier or modulator)
*/
type GenmidiOp2_OpSettings struct {
TremVibr uint8
AttDec uint8
SustRel uint8
Wave uint8
Scale uint8
Level uint8
_io *kaitai.Stream
_root *GenmidiOp2
_parent *GenmidiOp2_Instrument
}
func NewGenmidiOp2_OpSettings() *GenmidiOp2_OpSettings {
return &GenmidiOp2_OpSettings{
}
}
func (this *GenmidiOp2_OpSettings) Read(io *kaitai.Stream, parent *GenmidiOp2_Instrument, root *GenmidiOp2) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp13, err := this._io.ReadU1()
if err != nil {
return err
}
this.TremVibr = tmp13
tmp14, err := this._io.ReadU1()
if err != nil {
return err
}
this.AttDec = tmp14
tmp15, err := this._io.ReadU1()
if err != nil {
return err
}
this.SustRel = tmp15
tmp16, err := this._io.ReadU1()
if err != nil {
return err
}
this.Wave = tmp16
tmp17, err := this._io.ReadU1()
if err != nil {
return err
}
this.Scale = tmp17
tmp18, err := this._io.ReadU1()
if err != nil {
return err
}
this.Level = tmp18
return err
}
/**
* Tremolo/vibrato/sustain/KSR/multi
*/
/**
* Attack rate/decay rate
*/
/**
* Sustain level/release rate
*/
/**
* Waveform select
*/
/**
* Key scale level
*/
/**
* Output level
*/