Fairlight audio mixer

Some of the newer models of the ATEM switchers have Fairlight audio mixers in them instead of the more basic ATEM audio mixers of the previous models. These mostly use new datastructures to represent the mixer.

class pyatem.field.FairlightAudioInputField(raw)

Data from the FAIP. Describes the inputs to the fairlight mixer

Offset

Size

Type

Descriptions

0

2

u16

Audio source index

2

1

u8

Input type

3

2

?

unknown

5

1

u8

Index in group

10

1

u8

Changes when stereo is split into dual mono

12

1

u8

Analog audio input level [1=mic, 2=line]

Val

Input type

0

External video input

1

Media player audio

2

External audio input

After parsing: :ivar volume: Master volume for the mixer, signed int which maps [-10000 - 1000] to +10dB - -100dB (inf)

class pyatem.field.FairlightMasterPropertiesField(raw)

Data from the FAMP. Settings for the master bus on fairlight audio units.

Offset

Size

Type

Descriptions

0

1

?

unknown

1

1

bool

Enable master EQ

2

4

?

unknown

6

2

i16

EQ gain [-2000 - 2000]

8

2

?

unknown

10

2

u16

Dynamics make-up gain [0 - 2000]

12

4

i32

Master volume [-10000 - 1000]

16

1

bool

Audio follow video

17

3

?

unknown

After parsing: :ivar volume: Master volume for the mixer, signed int which maps [-10000 - 1000] to +10dB - -100dB (inf) :ivar eq_enable: Enabled/disabled state for the master EQ :ivar eq_gain: Gain applied after EQ, [-2000 - 2000] maps to -20dB - +20dB :ivar dynamics_gain: Make-up gain for the dynamics section, [0 - 2000] maps to 0dB - +20dB :ivar afv: Enable/disabled state for master audio-follow-video (for fade-to-black)

class pyatem.field.FairlightStripPropertiesField(raw)

Data from the FASP. Settings for a channel strip on fairlight audio units.

Offset

Size

Type

Descriptions

0

2

u16

Audio source index

14

1

u8

Split indicator? [01 for normal, FF for split]

15

1

u8

Subchannel index

18

1

u8

Delay in frames

22

2

i16

Gain [-10000 - 600]

29

1

bool

Enable EQ

34

2

i16

EQ Gain

38

2

u16

Dynamics gain

40

2

i16

Pan [-10000 - 10000]

46

2

i16

Volume [-10000 - 1000]

49

1

u8

AFV bitfield? 1=off 2=on 4=afv

The way byte 14 and 15 work is unclear at the moment, this need verification on a mixer with an video input that has more than 2 embedded channels, of of these bytes might be a channel count.

After parsing: :ivar volume: Master volume for the mixer, signed int which maps [-10000 - 1000] to +10dB - -100dB (inf) :ivar eq_enable: Enabled/disabled state for the master EQ :ivar eq_gain: Gain applied after EQ, [-2000 - 2000] maps to -20dB - +20dB :ivar dynamics_gain: Make-up gain for the dynamics section, [0 - 2000] maps to 0dB - +20dB :ivar afv: Enable/disabled state for master audio-follow-video (for fade-to-black)

class pyatem.field.FairlightStripDeleteField(raw)

Data from the FASD. Fairlight strip delete, received only when changing the source routing in fairlight to remove channels that have changed.

class pyatem.field.FairlightTallyField(raw)

Data from the FMTl. Encodes the state of tally lights on the audio mixer

Offset

Size

Type

Descriptions

0

2

u16

Number of tally lights

2

1

u8

Input type

3

2

?

unknown

5

1

u8

Index in group

10

1

u8

Changes when stereo is split into dual mono

12

1

u8

Analog audio input level [1=mic, 2=line]

Val

Input type

0

External video input

1

Media player audio

2

External audio input

After parsing: :ivar volume: Master volume for the mixer, signed int which maps [-10000 - 1000] to +10dB - -100dB (inf)

class pyatem.field.AtemEqBandPropertiesField(raw)

Data from the AEBP field. This encodes the EQ settings in the fairlight mixer. For every channel there will be 6 off these fields sent, one for every band of the EQ. The “possible band filters” differentiates the first and last band which have a different option list for the filter dropdown in the UI.

Offset

Size

Type

Descriptions

0

2

u16

Audio source index

2

2

?

unknown

4

4

?

unknown

14

1

u8

Split indicator? [01 for normal, FF for split]

15

1

u8

subchannel index

16

1

u8

bond index

17

1

bool

band enabled

18

1

u8

possible band filters

19

1

u8

band filter

20

1

?

?

21

1

?

band frequency range

26

2

u16

band frequency

28

4

i32

band gain

32

2

u16

band Q

Val

Band filter

01

Low shelf

02

Low pass

04

Bell

08

Notch

10

High pass

20

High shelf

After parsing: :ivar volume: Master volume for the mixer, signed int which maps [-10000 - 1000] to +10dB - -100dB (inf)

Level meters

class pyatem.field.FairlightMeterLevelsField(raw)

Data from the FMLv. This contains the realtime audio levels for the fairlight audio mixer

Offset

Size

Type

Description

0

6

?

Unknown

6

1

u8

is_split, 255 when split or 0 when it isn’t

7

1

u8

subchannel index

8

2

u16

source index

10

2

i16

Input level left, -10000 to 0

12

2

i16

Input level right, -10000 to 0

14

2

i16

Input peak left, -10000 to 0

16

2

i16

Input peak right, -10000 to 0

18

2

i16

Expander gain reduction, -10000 to 0

20

2

i16

Compressor gain reduction, -10000 to 0

22

2

i16

Limiter gain reduction, -10000 to 0

24

2

i16

Output level left, -10000 to 0

26

2

i16

Output level right, -10000 to 0

28

2

i16

Output peak left, -10000 to 0

30

2

i16

Output peak right, -10000 to 0

32

2

i16

Fader level left, -10000 to 0

34

2

i16

Fader level right, -10000 to 0

36

2

i16

Fader peak left, -10000 to 0

38

2

i16

Fader peak right, -10000 to 0

After parsing:

Variables:
  • index – Channel source index

  • is_split – Stereo channel is split into dual mono

  • subchannel – Channel index after splitting

  • strip_id – Strip identifier in {source}.{subchannel} format

  • input – Volume level before dynamics

  • output – Volume level after dynamics

  • level – Volume level after fader

  • expander_gr – Gain reduction by the expander

  • compressor_gr – Gain reduction by the compressor

  • limiter_gr – Gain reduction by the limiter

class pyatem.field.FairlightMasterLevelsField(raw)

Data from the FDLv. This contains the realtime audio levels for the master channel of the fairlight mixer

Offset

Size

Type

Description

0

2

i16

Input level left, -10000 to 0

2

2

i16

Input level right, -10000 to 0

4

2

i16

Input peak left, -10000 to 0

6

2

i16

Input peak right, -10000 to 0

8

2

i16

Compressor gain reduction, -10000 to 0

10

2

i16

Limiter gain reduction, -10000 to 0

12

2

i16

Output level left, -10000 to 0

14

2

i16

Output level right, -10000 to 0

16

2

i16

Output peak left, -10000 to 0

18

2

i16

Output peak right, -10000 to 0

20

2

i16

Fader level left, -10000 to 0

22

2

i16

Fader level right, -10000 to 0

24

2

i16

Fader peak left, -10000 to 0

26

2

i16

Fader peak right, -10000 to 0

After parsing: :ivar input: Volume level before dynamics :ivar output: Volume level after dynamics :ivar level: Volume level after fader :ivar compressor_gr: Gain reduction by the compressor :ivar limiter_gr: Gain reduction by the limiter

Monitoring

class pyatem.field.FairlightHeadphonesField(raw)

Data from the FMHP, phones output volume and mute

This doesn’t get triggered when soloing channels.

Offset

Size

Type

Descriptions

0

4

i32

Volume in 0.01 dB (-60.00 to +6.00 dB)

5

4

?

Unknown

8

1

bool

Muted (0) / Umuted (1)

9

1

u8

Last soloed channel (just the main part)

10

22

?

Unknown

class pyatem.field.FairlightSoloField(raw)

Data from the FAMS, soloing channels to phones

Offset

Size

Type

Descriptions

0

1

bool

Anything soloed?

1

7

?

Unknown

8

1

u8

Unknown: 0x00 for HDMI channels, 0x05 for 3.5mm jack

9

1

u8

Soloed channel (main)

10

12

?

Unknown

22

1

u8

No subchannels (0x01), split into L/R (0xff)

23

1

u8

Soloed channel (subchannel)