1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//! Nord Stage 3 (`.ns3f`, `.ns3l`, `.ns3s`, `.ns3y`, `.ns3t`).
//!
//! The program body decodes in full, **both panels**. A program is 22 bytes of
//! globals then two 263-byte panel blocks of the same layout — Panel A and Panel B,
//! the instrument's two independent setups, each with its own organ, piano, synth,
//! extern and effects. They are not copies of each other, `panel_enable` selects
//! A, B, or both layered, and their fields are reached as `panel_a.*` and
//! `panel_b.*`. The synth preset (`ns3y`) is Panel A's synth block under its own
//! tag. The song and settings are stubs. ⚠️ The extension letters are
//! traps here: `f` is the program, `s` is a *song* (a set list on the Electro 5),
//! `y` is a synth patch (the *settings* on the Stage 2), and `t` is the settings.
//!
//! The community byte maps the placements come from are
//! [Chris55/nord-documentation](https://github.com/Chris55/nord-documentation), the
//! public documentation this crate's provenance marks name.
//!
//! Community documentation reports a second checksum at file offset `0x78`
//! ("covering synth and organ panel data"). The corpus refutes it: the word
//! there is not any common CRC-32 over any contiguous or field-excised range,
//! never changes between near-identical program pairs whose bodies differ (the
//! `0x18` checksum always does), takes clustered values that many unrelated
//! programs share, and sits beside bytes constant across every specimen — the
//! signature of bit-packed panel parameters, which is what body offset `0x4c`
//! holds. Programs re-saved after panel edits keep decoding, so nothing
//! verifies it; treat the claim as mistaken until a specimen shows otherwise.
use raw_format;
pub use Panel;
pub use Program;
pub use SynthPreset;
raw_format!;
raw_format!;