├── README.md ├── boot-menu.md ├── hardware.md ├── keys.md ├── lfo.md └── svg.md /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Firmware Docs for the OP-1 3 | 4 | _______________________________________________________________________________________________________________ 5 | | _____________________________________________________________________________________________________ | 6 | | | | | | | | | | | :: | 7 | | | ····· | (_) | | ___ | ___ | ___ | ___ | / | | 8 | | | ······· |___________| | | | | | | | | | | | | |_____| | 9 | | | ······· | | | | |___| | |___| | |___| | |___| | | | 10 | | | ····· | | | | | | | | O | | 11 | | |___________|_____|_____|_______________________|___________|___________|___________|___________|_____| | 12 | | | | | | | | | | | | | | | | | | | | . | 13 | | | | Ϙ | ◯_◯ | ||| | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | .:..| : | 14 | | |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| : | 15 | | | | | | | | | | | | | | | | | 16 | | | ↥ | ↓ | >8 | O | O | O | O | O | O | O | O | O | O | | 17 | | |_____|_____|_____|________|_____|________|________|________|________|_____|________|________|________| | 18 | | | | | | | | | | | | | | | | | | | | | 19 | | | ◉ | ▶ | ■ | | | | | | | | | | | | | | | | 20 | | |_____|_____|_____| | | | | | | | | | | | | | | | 21 | | | | | | | | | | | | | | | | | | | | | 22 | | | ‹ | › |Shift| | | | | | | | | | | | | | | | 23 | | |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____| | 24 | |_______________________________________________________________________________________________________________| 25 | 26 | 27 | Documentation and research for creating custom firmware for the OP-1. 28 | 29 | ## Firmware Description 30 | 31 | The firmware update files that TE distribute contain the full firmware needed to run the synth. The files are named something like 'op1_218.op1' and begin with a 4 byte CRC32 checksum. The rest of the file is the actual firmware compressed with LZMA. The checksum is used to verify that the entire file got transfered to the OP-1 and that it's contents haven't changed during the transfer. 32 | 33 | | CRC32 (4 bytes) | LZMA compressed data (the rest of the file size) | 34 | 35 | Decompressing the LZMA data yields a TAR archive, which can be unpacked to reveal all files in the firmware. 36 | The directory structure is shown below. 37 | 38 | ├── content 39 | │ ├── audio 40 | │ │ ├── drum [.raw files] 41 | │ │ │ └── [all drum samples for preset slots 1-8] 42 | │ │ ├── factory_drum [.raw files] 43 | │ │ │ └── [all drum samples used for factory presets] 44 | │ │ ├── factory_synth [.raw files] 45 | │ │ │ └── [all synth samples used for factory presets] 46 | │ │ ├── preset_drum 47 | │ │ │ └── [empty] 48 | │ │ ├── preset_synth 49 | │ │ │ └── [empty] 50 | │ │ ├── speech 51 | │ │ │ └── op1patch.raw [audio that's added in all non-sample .aif patch files] 52 | │ │ └── synth [.raw files] 53 | │ │ └── [synth samples for presets slots that use the sampler synth] 54 | │ ├── display [.svg files] 55 | │ │ └── [all the graphics for the UI] 56 | │ ├── kerntable.db [font kerning data] 57 | │ ├── op1.db 58 | │ ├── op1_factory.db [factory presets/factory reset data] 59 | │ └── tape.db [tape clips, loop points etc] 60 | ├── OP1_vdk.ldr [firmware code] 61 | └── te-boot.ldr [bootloader] 62 | 63 | ## Encryption of OP1_vdk.ldr 64 | The code blocks of OP1_vdk.ldr are encrypted using the [XTEA algortihm](https://en.wikipedia.org/wiki/XTEA). 65 | In each block of 24 bytes the first 8 bytes are encrypted and the following 16 bytes are unencrypted. 66 | The key is read from the blackfin OTP memory page 0xd0. 67 | 68 | # Databases (specifically op1_factory.db) 69 | TODO: Table descriptions, synth & drum table data descriptions, 16 preset limit, etc. 70 | 71 | *Notes:* 72 | 73 | - The `folder` column in `synth_presets` is actually an arbitrary string, not the synth engine name. This means we could have custom folders that contain any types of synths. 74 | 75 | # Graphics (SVG) 76 | TODO: How the svg ID's are used, how the file format should be preserved and recommended svg editors etc. 77 | 78 | ## Font & Symbols 79 | 80 | The OP-1 font is defined in the `opfont.svg` file. It defines the basic alphabet only in upper case and also contains additional UI symbols. 81 | Each character or symbol in the SVG file is mapped to a character by the `id` attribute. For example, the symbol for letter `A` has an `id` of `a`. 82 | During rendering the spacing between characters is determined by the `kerntable.db` database file. 83 | 84 | - All alphabetic characters are upper case, but are refered to with a lower case `id`. 85 | - Various UI symbols are refered to with an upper case letter. E.g. the drum symbol has id `D`. 86 | - Special characters that can't validly be used as an id, are instead referenced in a special hex notation. E.g the id for < is `_x3C_`. 87 | - Custom symbols can be added as long as all symbols have unique ids. 88 | 89 | *Special symbols:* 90 | 91 | - D: Drum icon 92 | - Q: Sequencer icon 93 | - X: FX icon (blue) 94 | - A: Envelope icon (blue) 95 | - L: LFO icon (blue) 96 | - H: FX icon (green) 97 | - E: Envelope icon (green) 98 | - F: LFO icon (green) 99 | - S: Synth icon (blue) 100 | - T: Tape icon (red) 101 | - M: Mixer icon (gray) 102 | - Y: Musical keyboard icon (blue) 103 | - I: FX blend icon (blue) 104 | - J: Blend icon without `FX` text, only the overlapping circles (blue) 105 | - Z: EQ icon (blue) 106 | 107 | # Preset Files (AIF) 108 | TODO: How the preset data is embedded, how to extract it, etc. 109 | 110 | -------------------------------------------------------------------------------- /boot-menu.md: -------------------------------------------------------------------------------- 1 | # Boot Menu 2 | 3 | TODO: Document older versions (well we can't because the bootloader can't be 4 | downgraded). 5 | 6 | The OP-1 has a boot menu for running tests and uploading firmware etc. 7 | To access it hold down the COM button and power on the unit. 8 | 9 | 10 | # Options in FW v 225 - TE-BOOT v2.13 (and how they are shown on the display) 11 | 12 | TE-BOOT v2.13 13 | 1. Upload firmware 14 | 2. Function test 15 | 16 | 7. Factory reset 17 | 8. Format drive 18 | 19 | 20 | Pressing the relevant numbers on the keyboard runs the different functions. 21 | 22 | 23 | ## Additional Options 24 | 25 | In addition to the listed functions there are at least two hidden ones: 26 | Shift - 3: Extended function test 27 | Shift - 4: Flip display mode (WARNING: this flips the display vertically. You 28 | can flip it back by rebooting into the boot menu and pressing Shift - 4 again. 29 | 30 | -------------------------------------------------------------------------------- /hardware.md: -------------------------------------------------------------------------------- 1 | # OP-1 Hardware 2 | 3 | NOTE: This document is incomplete. 4 | 5 | 6 | ## Overview 7 | 8 | The OP-1 is made up of the following parts: 9 | 10 | - Aluminium Chassis 11 | - Speaker 12 | - UI Board 13 | - Display 14 | - DSP Board 15 | - Battery 16 | - IO Board 17 | - Keyboard 18 | - Ribbon cable (connects all PCB:s together) 19 | 20 | 21 | ## Display 22 | 23 | The display size is listed as 320x160 pixels. In reality it's a lot bigger 24 | vertically as part of it is hidden under the keyboard. The actual size is 25 | 320x240. In addition to this mismatch the actual visible portion of the 26 | display is actually closer to 150px high. 27 | 28 | - Part Number: 74-X000045 29 | - Width: 68mm 30 | - Height: 49mm 31 | - Resolution: 320x240 px 32 | - Usable resolution: ~ 320x150 px 33 | 34 | 35 | ## Battery 36 | 37 | The OP-1 battery is a 3.7V li-polymer battery rated at 1800 mAh. 38 | 39 | - Width: 70mm 40 | - Height: 50mm 41 | - Depth: 7mm 42 | [Source: iFixit](https://www.ifixit.com/Guide/Teenage+Engineering+OP-1+Battery+Replacement/65563) 43 | 44 | The model number is 055070 and the connector type is *probably* a JST ACH. 45 | [Source: operator-1.com](https://www.operator-1.com/index.php?p=/discussion/comment/41372/#Comment_41372) 46 | The connector on the PCB looks like BM02B-ACHSS-GAN-TF(LF)(SN) and the connector 47 | on the battery looks like ACHR-02V-S. 48 | 49 | TODO: Verify connector type and exact part number. 50 | 51 | 52 | ## DSP Board 53 | 54 | - Main processor: ADSP-BF524C2 55 | 56 | Additional info: 57 | 58 | [Source: @Punji at operator-1.com](https://www.operator-1.com/index.php?p=/discussion/comment/34440/#Comment_34440) 59 | 60 | The three S9C are Analog Devices ADG884 audio switches. 61 | The 23017 is an I/O expander. 62 | The 3576 is a power management IC with USB OTG support. 63 | The 5810D is an OLED power source. 64 | The 345B is an accelerometer IC. 65 | The LFKQ is a LTC2941 battery gas gauge monitor. 66 | 67 | -------------------------------------------------------------------------------- /keys.md: -------------------------------------------------------------------------------- 1 | # op-1 keys 2 | 3 | ### tape mode 4 | 5 | | cmd | desc | 6 | | --- | --- | 7 | | `shift + help` | set date - time | 8 | | `shift + tempo` | detune notes - cents | 9 | | `shift + tape` | erase tape | 10 | | `shift + synth` | undo edits and revert to the preset | 11 | | `shift + drum` | undo edits and revert to the preset | 12 | | `shift + mixer` | signal flow screen | 13 | | `blue (default)` | explore the tape in bits of 1/24 seconds | 14 | | `blue (while playing)` | scrub through tape | 15 | | `blue (while recording)` | change pitch | 16 | | `shift + blue` | slide a take | 17 | | `green` | slide loop out | 18 | | `shift + green` | slide loop in | 19 | | `white` | change tape speed like +1, +2, +3 | 20 | | `shift + white` | change tape speed in percentages | 21 | | `orange` | record level | 22 | | `shift + orange` | sensitive record level (change in tiny bits) | 23 | | `t1-4` | select track | 24 | | `shift + t1-4` | mute/reactivate track | 25 | | `< >` | rewind / forward | 26 | | `play + < >` | fast rewind / forward | 27 | | `shift + < >` | jump from bar to bar | 28 | | `stop + <` | jump to the very beginning of the tape. | 29 | | `stop + >` | jump to the end of the last take on the tape, if there are multiple tracks overlapping, this will go to the longest one of the last takes. | 30 | | `shift + play` | reverse playback | 31 | | `rec (hold)` | stand ready for recording (press a key) | 32 | | `shift + rec` | stand ready for tape roll (press play to go) | 33 | | `split` | a take to pieces | 34 | | `shift + split` | join takes (joins the next closest take on either side of the active one) | 35 | | `lift` | cut or delete a take | 36 | | `shift + lift` | advanced lift - lift all tracks into memory. | 37 | | `region lift` | use the loop in and out points to define the part you want to lift. | 38 | | `drop` | paste a take (tape moves each time to the end of a dropped take) | 39 | | `sequencer` | open/turn-off sequencer | 40 | | `shift + sequencer` | select sequencer mode | 41 | | `(1) loop in` | sets the loop in point of the tape. | 42 | | `(2) loop out` | this sets the loop out point. | 43 | | `(3) loop toggle` | toggles loop on and off, remembers the in and out of the previous loop | 44 | | `(3) (when playing)` | recreates the previous loop | 45 | | `shift + loop toggle` | loop current take. | 46 | | `(4) break` | stops the tape. if a loop is active it will continue in the background to keep the break in time. | 47 | | `(5) reverse` | change direction of the tape. | 48 | | `(6) chop` | a tempo locked repeat type of effect. | 49 | | `(7)-(8) memo 1-2` | memorize any parameter in tape or mixer for instant recall. | 50 | 51 | ### in synth (t2) 52 | 53 | | cmd | desc | 54 | | --- | --- | 55 | | `shift` | play mode | 56 | 57 | ### in drum mode engine (t1) 58 | 59 | | cmd | desc | 60 | | --- | --- | 61 | | `blue` | pitch | 62 | | `shift + blue` | direction | 63 | | `green` | in point | 64 | | `shift + green` | fine tune in point, sensitive | 65 | | `white` | out point | 66 | | `shift + white` | fine tune out point, sensitive | 67 | | `orange` | play mode | 68 | | `shift + orange` | level | 69 | 70 | ### in drum mode dynamic envelope (t2) 71 | 72 | | cmd | desc | 73 | | --- | --- | 74 | | `blue` | attack level | 75 | | `green` | mid-part level | 76 | | `white` | release level | 77 | | `orange` | adjust region | 78 | 79 | ### in synth and drum mode 80 | 81 | | cmd | desc | 82 | | --- | --- | 83 | | `1-8` | instant access keys to sounds | 84 | | `shift + synth` | undo edits and tweaks (done with t1-4) | 85 | | `shift + 1-8` | change the sound attached to the instant access key | 86 | | `shift + t1-4` | change the modules of the sound without changing the sound. | 87 | | `< >` | octave shift | 88 | 89 | > for example, shift + t1 will change the synth engine but it will keep the tweaks and edits you made on the sound, contrary to shift + 1, which will change the sound itself by selecting a sound from one of the synth engines thus making you lose all the tweaks and edits you made. 90 | 91 | ### in mixer mode 92 | 93 | | cmd | desc | 94 | | --- | --- | 95 | | `shift + mixer` | signal flow screen | 96 | 97 | -------------- 98 | 99 | sourced from an [operator-1.com thread](https://www.operator-1.com/index.php?p=/discussion/2271/all-key-combinations-and-functions-of-op-1) 100 | -------------------------------------------------------------------------------- /lfo.md: -------------------------------------------------------------------------------- 1 | # LFO Description 2 | 3 | LFO types and their parameter values with: 4 | 5 | - Knob value type 6 | - Default value (based on latest official firmware 'op1_14203.op1') 7 | - Min value 8 | - Max value 9 | - The ^ symbol in the headers indicates the shift values (pressing shift and turning knob) 10 | 11 | 12 | ## Bend 13 | 14 | | Type | Blue (1) | Green (2) | White (3) | Red (4) | ^Blue (5) | ^Green (6) | ^White (7) | ^Red (8) | 15 | | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | 16 | | Default | 7200 | 7100 | 32767 | 0 | 0 | 0 | 0 | 2048 | 17 | | Min | 1024 | 1024 | -32767 | 6208 | 0 | 0 | 0 | 1024 | 18 | | Max | 15360 | 7168 | 32767 | 6208 | 0 | 0 | 0 | 3072 | 19 | 20 | ### Knobs 21 | 22 | - Blue (lfo knob dest) 23 | > 4 values: blue, green, white, red 24 | > min: 1024 25 | > max: 15360 26 | 27 | - Green (lfo engin dest) 28 | > 4 values: synth, envelope, fx, sound 29 | > min: 1024 30 | > max: 7168 31 | 32 | - White (lfo amount) 33 | > Scale: -100 - 100 34 | > min: -32767 35 | > max: 32767 36 | 37 | - Red (bend activation) 38 | > Value not clear 39 | > min: 6208 40 | > max: 6208 41 | 42 | - Shift Red (lfo direction) 43 | > 2 values: up, down 44 | > min: 1024 45 | > max: 3072 46 | 47 | 48 | ## Crank 49 | 50 | | Type | Blue (1) | Green (2) | White (3) | Red (4) | ^Blue (5) | ^Green (6) | ^White (7) | ^Red (8) | 51 | | ---: | ---: | ---: | ----: | ---: | ---: | ---: | ---: | ---: | 52 | | Default | 0 | 16384 | 2000 | 2000 | 0 | 0 | 0 | 0 | 53 | | Min | -576 | 0 | 1024 | 1024 | 8512 | 0 | 0 | 0 | 54 | | Max | 1280 | 32767 | 7168 | 15360 | 12992 | 0 | 0 | 0 | 55 | 56 | ### Knobs 57 | 58 | - Blue (crank speed) 59 | > Value not clear 60 | > min: -576 61 | > max: 1280 62 | 63 | - Green (lfo amount) 64 | > Scale 0 - 100 65 | > min: 0 66 | > max: 32767 67 | 68 | - White (lfo engin dest) 69 | > 4 values: synth, envelope, fx, sound 70 | > min: 1024 71 | > max: 7168 72 | 73 | - Red (lfo knob dest) 74 | > 4 values: blue, green, white, red 75 | > min: 1024 76 | > max: 15360 77 | 78 | 79 | ## Element 80 | 81 | | Type | Blue (1) | Green (2) | White (3) | Red (4) | ^Blue (5) | ^Green (6) | ^White (7) | ^Red (8) | 82 | | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | 83 | | Default | 2000 | 4000 | 2000 | 2000 | 0 | 0 | 0 | 0 | 84 | | Min | 1024 | -32767 | 1024 | 1024 | 0 | 0 | 0 | 0 | 85 | | Max | 7168 | 32767 | 7168 | 15360 | 0 | 0 | 0 | 0 | 86 | 87 | ### Knobs 88 | 89 | - Blue (source) 90 | > 4 values: g, mic, evelope, sigma (?) 91 | > min: 1024 92 | > max: 7168 93 | 94 | - Green (lfo amount) 95 | > Scale -100 - 100 96 | > min: -32767 97 | > max: 32767 98 | 99 | - White (lfo engin dest) 100 | > 4 values: synth, envelope, fx, sound 101 | > min: 1024 102 | > max: 7168 103 | 104 | - Red (lfo knob dest) 105 | > 4 values: blue, green, white, red 106 | > min: 1024 107 | > max: 15360 108 | 109 | 110 | ## Midi 111 | 112 | TODO: check min & max values 113 | 114 | * Defaults: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000 115 | 116 | ### Knobs 117 | 118 | - All Knobs (lfo knob dest) 119 | > 4 values: blue, green, white, red 120 | 121 | - All Knobs with Shift (lfo engine dest) 122 | > 4 values: synth, envelope, fx, sound 123 | 124 | 125 | ## Random 126 | 127 | | Type | Blue (1) | Green (2) | White (3) | Red (4) | ^Blue (5) | ^Green (6) | ^White (7) | ^Red (8) | 128 | | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | 129 | | Defaults | 2000 | 4000 | 2000 | 24000 | 0 | 0 | 0 | 0 | 130 | | Min | 0 | 0 | 1024 | 0 | 0 | 0 | 0 | 0 | 131 | | Max | 32767 | 32767 | 5120 | 32767 | 0 | 0 | 0 | 0 | 132 | 133 | ### Knobs 134 | 135 | - Blue (lfo amount) 136 | > Scale: 0 - 100 137 | > min: 0 138 | > max: 32767 139 | 140 | - Green (lfo speed) 141 | > Scale: unclear (min to max is one knob revolution) 142 | > min: 0 143 | > max: 32767 144 | 145 | - White (lfo engine dest) 146 | > 4 values: synth, envelope, fx, sound 147 | > min: 1024 148 | > max: 5120 149 | 150 | - Red (lfo envelope) 151 | > Value not clear (min to max is six knob rotations, seems like a signed value) 152 | > min: 0 153 | > max: 32767 154 | 155 | 156 | ## Tremolo 157 | 158 | | Type | Blue (1) | Green (2) | White (3) | Red (4) | ^Blue (5) | ^Green (6) | ^White (7) | ^Red (8) | 159 | | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | 160 | | Defaults | 16000 | 0 | 0 | 16000 | 0 | 0 | 0 | 0 | 161 | | Min | 0 | -32767 | -32767 | 0 | 0 | 0 | 0 | 0 | 162 | | Max | 32440 | 32767 | 32767 | 32767 | 0 | 0 | 0 | 0 | 163 | 164 | ### Knobs 165 | 166 | - Blue (lfo speed) 167 | > Dual scale: 8 - 1 and dial with half a rotation 168 | > min: 0 169 | > max: 32440 170 | 171 | - Green (lfo pitch amount) 172 | > Scale: -100 - 100 173 | > min: -32767 174 | > max: 32767 175 | 176 | - White (lfo volume amount) 177 | > Scale: -100 - 100 178 | > min: -32767 179 | > max: 32767 180 | 181 | - Red (lfo envelope) 182 | > Value not clear (min to max is six knob rotations, seems like a signed value) 183 | > min: 0 184 | > max: 32767 185 | 186 | 187 | ## Value 188 | 189 | TODO: Add all missing values 190 | 191 | ### Knobs 192 | 193 | - Blue (lfo speed) 194 | > Dual scale: 8 - 1 and dial with half a rotation 195 | 196 | - Green (lfo amount) 197 | > Scale: -100 - 100 198 | 199 | - White (lfo engine dest) 200 | > 4 values: synth, envelope, fx, sound 201 | 202 | - Red (lfo envelope) 203 | > Value not clear (min to max is six knob rotations, seems like a signed value) 204 | 205 | 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /svg.md: -------------------------------------------------------------------------------- 1 | 2 | # OP-1 SVG 3 | 4 | The OP-1 can parse SVG files but its very strict regarding the format. It can 5 | understand most graphics primitives, but they need to be formatted properly. 6 | The limitations make it a challenge to modify the graphics with tools such as 7 | Inkscape. Lots of SVG features are entirely unsupported. 8 | 9 | 10 | ## Supported Elements (non exhaustive list) 11 | 12 | - svg 13 | 14 | - rect 15 | 16 | - g 17 | 18 | - line 19 | 20 | - path 21 | 22 | - Only supports a specific formatting of the `d` attribute. 23 | 24 | - It seems that line commands only supports a single coordinate pair. That means that `L 10,10 20,20` doesn't work and should instead be written as `L 10,10 L 20,20`. The same logic might apply to other commands too but I haven't verified that yet. 25 | 26 | - polyline 27 | 28 | - circle 29 | 30 | - polygon 31 | 32 | - ellipse 33 | 34 | - defs (?) 35 | 36 | - clipPath (?) 37 | 38 | - use (?) 39 | 40 | 41 | ## Supported attributes 42 | 43 | xmlns, xmlns:xlink, 44 | version, id, x, y, width, height, viewBox, 45 | enable-background, space, fill, stroke, d, stroke-width, 46 | cx, cy, r, x1, y1, x2, y2, stroke-dasharray, display, 47 | stroke-linecap, points, rx, ry, stroke-linejoin, transform, 48 | stroke-miterlimit, href, overflow, clip-path, opacity, 49 | 50 | 51 | ## Transformations 52 | 53 | Transforms seem to be mostly unsupported, except for the matrix transform 54 | that seems to be used in a few of the graphics. Transforms on groups of 55 | elements don't seem to work at all. 56 | 57 | 58 | ## Decimal precision 59 | 60 | The OP-1 crashes if numeric values in SVG files have more than 4 decimals 61 | of precision. 62 | 63 | 64 | ## Colos 65 | 66 | The OP-1 uses the colors in colors.svg for dynamic parts of the graphics. 67 | Static parts of the graphics use the same colors, but they're separately 68 | specified in the individual SVG files. 69 | 70 | 71 | ## Fonts 72 | 73 | The OP-1 uses the characters in opfont.svg for drawing dynamic texts in the 74 | graphics. Similarly as the colors static texts are written directly into 75 | the SVG files. 76 | 77 | 78 | ## Desiging custom graphics 79 | 80 | If and when designing custom GFX for the OP-1 you should use the default colors and 81 | line widths. Please keep to the original TE OP-1 vibe if you know what I mean. 82 | 83 | 84 | 85 | --------------------------------------------------------------------------------