mirror of
https://github.com/KrisKennaway/ii-sound.git
synced 2024-06-02 01:41:30 +00:00
Compare commits
87 Commits
468d47966d
...
ca6973f2a2
Author | SHA1 | Date | |
---|---|---|---|
|
ca6973f2a2 | ||
|
2dff0c242c | ||
|
a7c8a2ff2b | ||
|
cf24da1228 | ||
|
5abad38314 | ||
|
9129cdccfe | ||
|
2907ba583d | ||
|
893e872da4 | ||
|
b243e7afb4 | ||
|
30c79accd7 | ||
|
5d628aec0f | ||
|
e4f20ea9c7 | ||
|
183781da60 | ||
|
cf7716d068 | ||
|
f64b1a6e2c | ||
|
e79ed985bc | ||
|
a356f6a3a7 | ||
|
cea66fe916 | ||
|
21c2257e5c | ||
|
8eeb26379d | ||
|
6ff35df1ae | ||
|
233e94d94f | ||
|
f65aaba765 | ||
|
2e3e51bb99 | ||
|
18a16999b0 | ||
|
a9e7a1bbff | ||
|
6772b579ca | ||
|
0d217e9326 | ||
|
d153119231 | ||
|
535656aceb | ||
|
2a20bebb37 | ||
|
3458d3a1de | ||
|
2016e4a5f1 | ||
|
622583696d | ||
|
efb66e03d8 | ||
|
695ddb2c10 | ||
|
445ec18f34 | ||
|
47c7f441cf | ||
|
c33e835f7a | ||
|
9a9434e9aa | ||
|
d2cdceb04e | ||
|
11afaa152b | ||
|
346c647c40 | ||
|
73ef91b5ad | ||
|
804ce60434 | ||
|
efa63a5ab2 | ||
|
e0908a9ced | ||
|
bc032ae3ca | ||
|
cb5de62cc8 | ||
|
a48e7b796c | ||
|
b1bd8f7b19 | ||
|
13fb60fed0 | ||
|
1552715b49 | ||
|
fbd6b956d1 | ||
|
8ea4f150ad | ||
|
b97a625d7d | ||
|
33ce46a19c | ||
|
929ea026d9 | ||
|
daee564255 | ||
|
ccba51eead | ||
|
38280e7d93 | ||
|
d4bc2d45e5 | ||
|
4090c502a8 | ||
|
4666171aaa | ||
|
a1a1f33c21 | ||
|
089591737f | ||
|
cef38dae59 | ||
|
4701dc14f1 | ||
|
93b63db558 | ||
|
0bb7871355 | ||
|
c776b3cbe2 | ||
|
baca499d3b | ||
|
f1b6983dda | ||
|
706ba54f5b | ||
|
54369a620f | ||
|
194da9a509 | ||
|
1cf1ed25bb | ||
|
b8de1d4f7b | ||
|
ccc8594c45 | ||
|
76d6bc8426 | ||
|
22babbaa73 | ||
|
3ef80ec6cf | ||
|
f17db175a5 | ||
|
659d9906bd | ||
|
8122f65dc6 | ||
|
938fbae488 | ||
|
7a4a36af6b |
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
*.btc
|
||||
*.wav
|
||||
*.a2s
|
||||
*.mp3
|
||||
*.flac
|
274
README.md
274
README.md
|
@ -2,128 +2,47 @@
|
|||
|
||||
High quality audio player for streaming audio over Ethernet, for the Apple II.
|
||||
|
||||
**Dedicated to Woz on his 70th birthday. Thank you for a lifetime of enjoyment exploring your wonderful creation.**
|
||||
|
||||
Requires:
|
||||
* Uthernet II (currently assumed to be in slot 1)
|
||||
* Uthernet II (currently assumed to be in slot 3)
|
||||
* Enhanced //e or (untested) //gs.
|
||||
* The player will run on 6502 (and should even run on a 16KB machine, although the disk image uses ProDOS) but about
|
||||
10% _faster_ on a 6502 than 65c02 (and with lower audio quality, until the encoder understands this). See "future
|
||||
work" below.
|
||||
* The player should run on 6502 but about 10% _faster_ on a 6502 than 65c02 (and with lower audio quality, until
|
||||
the encoder understands this). See "future work" below.
|
||||
|
||||
NOTE: Ethernet addresses are hardcoded to 10.0.0.1 for the server and 10.0.65.02 for the Apple II. This is not
|
||||
currently configurable without reassembling.
|
||||
|
||||
## What this does
|
||||
The audio encoder runs on a modern machine, and produces an encoded audio file suitable for playback on the Apple
|
||||
II, via ethernet streaming.
|
||||
|
||||
The audio encoder runs on your modern machine, and produces a bytestream suitable for playback on the Apple II, via
|
||||
ethernet streaming.
|
||||
To encode audio, ][-Sound simulates the movement of the Apple II speaker clock cycle by cycle, and computes the exact
|
||||
clock cycles at which to invert the applied speaker voltage, so that the speaker traces out the desired audio waveform as accurately
|
||||
as possible.
|
||||
|
||||
It works by simulating the movement of the Apple II speaker at 1-cycle resolution, and computing the exact cycles
|
||||
that the speaker cone should switch direction so that it traces out the desired audio waveform as accurately as
|
||||
possible. This includes looking some number of cycles into the future to anticipate upcoming changes in the waveform
|
||||
(e.g. sudden spikes), so the speaker can be pre-positioned to best accommodate them.
|
||||
The resulting audio file causes the Apple II to follow this speaker trajectory with cycle-level precision when it is
|
||||
played, and typically ends up toggling the speaker about 100,000 times/second.
|
||||
|
||||
The resulting bytestream directs the Apple II to follow this speaker trajectory with cycle-level precision.
|
||||
TODO: link KansasFest 2022 slides/video
|
||||
|
||||
The actual audio playback code is small enough (~150 bytes) to fit in page 3. i.e. would have been small enough to type
|
||||
in from a magazine back in the day. The megabytes of audio data would have been hard to type in though ;) Plus,
|
||||
Uthernets didn't exist back then (although a Slinky RAM card would let you do something similar, see Future Work below).
|
||||
## Usage
|
||||
|
||||
# Implementation
|
||||
|
||||
The audio player uses [delta modulation](https://en.wikipedia.org/wiki/Delta_modulation) to produce the audio signal.
|
||||
|
||||
How this works is by modeling the Apple II speaker as an [RC circuit](https://en.wikipedia.org/wiki/RC_circuit). When
|
||||
we access $C030 it inverts the applied voltage across the speaker, and the speaker responds by moving
|
||||
asymptotically towards the new applied voltage level. Left to itself this results in an audio "tick". With some
|
||||
empirical tuning of the time constant of this RC circuit, we can precisely model how the Apple II speaker will respond
|
||||
to voltage changes, and use this to make the speaker "trace out" our desired waveform. We can't do this exactly --
|
||||
the speaker will zig-zag around the target waveform because we can only move it in finite steps -- so there is some
|
||||
left-over quantization noise that manifests as background static, though in our case this is barely noticeable.
|
||||
|
||||
Delta modulation with an RC circuit is also called "BTC", after https://www.romanblack.com/picsound.htm who described
|
||||
a number of variations on these (Apple II-like) audio circuits and Delta modulation audio encoding algorithms. See e.g.
|
||||
Oliver Schmidt's [PLAY.BTC](https://github.com/oliverschmidt/Play-BTc) for an Apple II implementation that plays from
|
||||
memory at 33KHz
|
||||
|
||||
The big difference with our approach is that we are able to target a 1MHz sampling rate, i.e. manipulate the speaker
|
||||
with 1-cycle precision, by choosing how the "player opcodes" are chained together by the ethernet bytestream.
|
||||
The catch is that once we have toggled the speaker we can't toggle it again until at least 10 cycles have passed (9
|
||||
cycles on 6502), but we can pick any such interval >= 10 cycles (except for 11 cycles because of 65x02 opcode timing
|
||||
limitations). Successive choices are independent.
|
||||
|
||||
In other words, we are able to choose a precise sequence of clock cycles in which to toggle the speaker, but there is a
|
||||
"cooldown" period and these cannot be spaced too close together.
|
||||
|
||||
The minimum period of 10 cycles is already short enough that it produces high-quality audio even if we only modulate
|
||||
the speaker at a fixed cadence of 10 cycles (i.e. at 102.4KHz instead of 1MHz), although in practice a fixed 14-cycle
|
||||
period gave better quality (10 cycles produces a quiet but audible background tone coming from some kind of harmonic --
|
||||
perhaps an interaction with the every-64-cycle "long cycle" of the Apple II). The initial version of ][-Sound used this
|
||||
approach (and also used the "spare" 4 cycles for a page-flipping trick to visualize the audio bitstream while playing).
|
||||
|
||||
## Player
|
||||
|
||||
The player consists of some ethernet setup code and a core playback loop of "player opcodes", which are the basic
|
||||
operations that are dispatched to by the bytestream.
|
||||
|
||||
Some other tricks used here:
|
||||
|
||||
- The minimal 10-cycle (9-cycle) speaker loop is: STA $C030; JMP (WDATA), where we use an undocumented property of the
|
||||
Uthernet II: I/O registers on the WDATA don't wire up all of the address lines, so they are also accessible at
|
||||
other address offsets. In particular WDATA+1 is a duplicate copy of WMODE. In our case WMODE happens to be 0x3.
|
||||
This lets us use WDATA as a jump table into page 3, where we place our player code. We then choose the network
|
||||
byte stream to contain the low-order byte of the target address we want to jump to next.
|
||||
|
||||
- We prepend runs of 2 or 3-cycle padding opcodes (NOP, dummy 3-cycle store) to allow jumping into an opcode at
|
||||
various entry points to give additional delay variants.
|
||||
|
||||
- The choice of cycle lengths for the delay+tick and delay-only opcodes is such that we can obtain any delay period
|
||||
between speaker ticks (except <10, or 11) by chaining them together.
|
||||
|
||||
- As with my [\]\[-Vision](https://github.com/KrisKennaway/ii-vision) streaming video+audio player, we schedule a "slow
|
||||
path" dispatch to occur every 2KB in the byte stream, and use this to manage the socket buffers (ACK the read 2KB and
|
||||
wait until at least 2KB more is available, which is usually non-blocking). While doing this we need to maintain a
|
||||
regular tick cadence so the speaker is in a known trajectory. We can compensate for this in the audio encoder.
|
||||
|
||||
## Encoding
|
||||
|
||||
The encoder models the Apple II speaker as an RC circuit with given time constant and simulates it at 1MHz (i.e.
|
||||
cycle-level) time resolution.
|
||||
|
||||
At every step we evaluate the possible next choices for the player, i.e. which player "opcode" we should branch to
|
||||
next, considering the effect this will have on the speaker movement. For example, an opcode that will run for 10 cycles
|
||||
and invert the speaker voltage on cycle 4.
|
||||
|
||||
To optimize the audio quality we look ahead some defined number of cycles (e.g. 20 cycles gives good results) and choose
|
||||
a speaker trajectory that minimizes errors over this range, considering all possible sequences of opcodes that we could
|
||||
choose to schedule during this cycle window. This makes the encoding exponentially slower, but improves quality since
|
||||
it allows us to e.g. anticipate large amplitude changes by pre-moving the speaker to better approximate them.
|
||||
|
||||
This also needs to take into account scheduling the "slow path" every 2048 output bytes, where the Apple II will manage
|
||||
the TCP socket buffer while ticking the speaker at a constant cadence (currently chosen to be every 14 cycles). Since
|
||||
we know this is happening we can compensate for it, i.e. look ahead to this upcoming slow path and pre-position the
|
||||
speaker so that it introduces the least error during this "dead" period when we're keeping the speaker in a net-neutral
|
||||
position.
|
||||
The simplest usage is:
|
||||
|
||||
```
|
||||
$ ./encode_audio.py <input> <step size> <lookahead steps> <output.a2s>
|
||||
$ ./encode_audio.py <input> <output.a2s>
|
||||
```
|
||||
|
||||
where:
|
||||
|
||||
* `input` is the audio file to encode. .mp3, .wav and probably others are supported.
|
||||
|
||||
* `step size` is the fractional movement from current voltage to target voltage that we assume the Apple II speaker is
|
||||
making during each clock cycle. A value of 500 (i.e. moving 1/500 of the distance) seems to be about right for my
|
||||
Apple //e. This corresponds to a time constant of about 500us for the speaker RC circuit.
|
||||
|
||||
* `lookahead steps` defines how many cycles into the future we want to look when optimizing. This is exponentially
|
||||
slower since we have to evaluate all possible sequences of player opcodes that could be chosen within the lookahead
|
||||
horizon. A value of 20 gives good quality.
|
||||
|
||||
* `output.a2s` is the output file to write to.
|
||||
|
||||
TODO: document flags
|
||||
|
||||
## Playback
|
||||
|
||||
Download the (bootable) Apple II player disk image [here](player/player.dsk)
|
||||
|
||||
## Serving
|
||||
|
||||
This runs a HTTP server listening on port 1977 to which the player connects, then unidirectionally streams it the data.
|
||||
|
@ -132,63 +51,122 @@ This runs a HTTP server listening on port 1977 to which the player connects, the
|
|||
$ ./play_audio.py <filename.a2s>
|
||||
```
|
||||
|
||||
## Future work
|
||||
A sample audio file can be downloaded [here](examples/adventure.a2s.bz2) ("Adventure" by [Alexander Nakarada](http://www.serpentsoundstudios.com), licensed under [CC BY Attribution 4.0](https://creativecommons.org/licenses/by/4.0/)). It first needs to be uncompressed, e.g.
|
||||
|
||||
### Ethernet configuration
|
||||
```
|
||||
% bunzip2 adventure.a2s.bz2
|
||||
% ./play_audio adventure.a2s
|
||||
```
|
||||
|
||||
# Details
|
||||
|
||||
## Theory of operation
|
||||
|
||||
Control of the Apple II speaker has very limited hardware support: accessing a special memory location ($C030 hex)
|
||||
causes the voltage across the speaker to be inverted (toggled high/low), which causes the speaker cone to begin
|
||||
switching position (in/out). By itself, a single memory access causes the speaker to emit a 'click'. Producing more
|
||||
complex sounds from the Apple II requires accessing the speaker address repeatedly, under direct CPU control.
|
||||
|
||||
][-Sound uses a highly optimized audio player running on the Apple II that is capable of accessing the speaker
|
||||
on _arbitrary_ clock cycles (i.e. at the maximum possible 1MHz resolution), as long as successive accesses are at least
|
||||
10 cycles apart.
|
||||
|
||||
The audio encoder uses [delta modulation](https://en.wikipedia.org/wiki/Delta_modulation) to produce the audio output.
|
||||
The audio stream is constructed based on a simulation of how the Apple II speaker behaves in response to changes in input
|
||||
voltage, which is used to optimize the audio quality.
|
||||
|
||||
Delta modulation has been previously used for Apple II audio playback from memory, e.g. Oliver Schmidt's [PLAY.BTC](https://github.com/oliverschmidt/Play-BTc)
|
||||
implements delta modulation at about 33KHz frequency and with 33Khz precision. i.e. every ~30 cycles, it either toggles
|
||||
the speaker or leaves it untouched for another 30 cycles.
|
||||
|
||||
The big difference with our approach is that we are able to achieve 1Mhz precision, and 100KHz frequency. i.e. ][-Sound
|
||||
is able to toggle the speaker at _any_ clock cycle (1MHz precision), as long as successive toggles are more than 10
|
||||
cycles apart (100KHz frequency).
|
||||
|
||||
The other major improvement is in accuracy of the Apple II speaker simulation. Previous delta modulation
|
||||
implementations modeled the speaker as an [RC circuit](https://en.wikipedia.org/wiki/RC_circuit) (based on https://www.romanblack.com/picsound.htm
|
||||
which described a number of variations of (Apple II-like) audio circuits and Delta modulation audio encoding algorithms,
|
||||
which they referred to as "Binary Time Constant" audio).
|
||||
|
||||
Instead, ][-Sound models the speaker as an [RLC circuit](https://en.wikipedia.org/wiki/RLC_circuit), i.e. damped harmonic oscillator, which matches the actual
|
||||
speaker response much more closely. At very short timescales the response of an RLC circuit (oscillatory response to
|
||||
applied voltage with exponential damping) looks approximately like that of an RC circuit (exponential response to
|
||||
applied voltage), which is why the simpler approach still gives reasonable results.
|
||||
|
||||
## Player
|
||||
|
||||
The player consists of some ethernet setup code and a core playback loop of "player opcodes", which are the basic
|
||||
operations that are dispatched to by the audio bytestream.
|
||||
|
||||
Some other tricks used here:
|
||||
|
||||
- The minimal 10-cycle (9-cycle) speaker loop is: `STA $C030; JMP (WDATA)`, where we use an undocumented property of the
|
||||
Uthernet II: the special I/O registers at $C0nx (which are used for communication with the onboard W5100 hardware)
|
||||
don't wire up all of the address lines, so they are also accessible at other address offsets. In particular WDATA+1 is a duplicate copy of WMODE. In our case WMODE happens to be 0x3.
|
||||
This lets us use WDATA as a dynamic jump table into page 3, where we place our player code. We then choose the
|
||||
network byte stream to contain the low-order byte of the target address we want to jump to next, and we'll
|
||||
indirect-jump to $03xx.
|
||||
|
||||
- The core audio playback loop is a carefully chosen sequence of 6502 opcodes that can be chained together (via this
|
||||
`JMP (WDATA)` trick) to access the speaker at any interval of >=10 CPU cycles. This only requires 16 bytes of space
|
||||
which easily fits within page 3.
|
||||
|
||||
- By chaining together these "player opcodes", we can toggle the speaker at arbitrary clock cycles, but no more often
|
||||
than every 10 cycles. This gives an upper bound of 102.4KHz for speaker accesses, which means a maximum audio
|
||||
frequency of 51.2KHz that is far outside audible range (this may seem like overkill, but a high modulation frequency is desirable in delta modulation to limit "quantization error", i.e. to allow zig-zagging back and forth as closely as possible around the target waveform)
|
||||
|
||||
- As with my [\]\[-Vision](https://github.com/KrisKennaway/ii-vision) streaming video+audio player, we schedule a "slow
|
||||
path" dispatch to occur every 2KB in the byte stream, and use this to manage the socket buffers (ACK the read 2KB and
|
||||
wait until at least 2KB more is available, which is usually non-blocking). While doing this we need to maintain a
|
||||
regular speaker cadence so the speaker is in a known trajectory. We can also partly compensate for this in
|
||||
the audio encoder.
|
||||
|
||||
## Encoding
|
||||
|
||||
The encoder models the Apple II speaker as an RLC circuit with parameters (resonance frequency and envelope decay rate)
|
||||
fitted to the observed speaker response, and simulates the speaker response at 1MHz (i.e. cycle-level) time resolution.
|
||||
|
||||
At every step we evaluate the possible next choices for the player, i.e. which player "opcode" we should branch to
|
||||
next, considering the effect this will have on the speaker movement. For example, an opcode that will run for 10 cycles
|
||||
and invert the speaker voltage on cycle 4.
|
||||
|
||||
To optimize the audio quality we look ahead some defined number of cycles (e.g. 30 cycles gives good results) and choose
|
||||
a speaker trajectory that minimizes errors over this range, considering all possible sequences of opcodes that we could
|
||||
choose to schedule during this cycle window. This makes the encoding exponentially slower, but improves quality since
|
||||
it allows us to e.g. anticipate large amplitude changes by pre-moving the speaker to better approximate them.
|
||||
|
||||
This also needs to take into account scheduling the "slow path" every 2048 output bytes, where the Apple II will manage
|
||||
the TCP socket buffer while ticking the speaker at some constant cadence of (a, b) cycles. Since
|
||||
we know this is happening we can compensate for it, i.e. look ahead to this upcoming slow path and pre-position the
|
||||
speaker so that it introduces the least error during this period when we have to step away from direct cycle-level control of the speaker position.
|
||||
|
||||
# Future work
|
||||
|
||||
## Ethernet configuration
|
||||
|
||||
Hard-coding the ethernet config is not especially user friendly. This should be configurable at runtime.
|
||||
|
||||
### 6502 support
|
||||
## In-memory playback
|
||||
|
||||
The player relies heavily on the JMP (indirect) 6502 opcode, which has a different cycle count on the 6502 (5 cycles)
|
||||
and 65c02 (6 cycles). This means the player will be about 10% **faster** on a 6502 (e.g. II+, Unenhanced //e), but audio
|
||||
quality will be off until the encoder is made aware of this and able to compensate.
|
||||
|
||||
This might be one of the few pieces of software for which a 65c02 at the same clock speed causes a measurable
|
||||
performance degradation (adding almost a minute to playback of an 8-minute song, until I compensated for it).
|
||||
|
||||
Hat tip to Scott Duensing who noticed that my sample audio sounded "a tad slow", which turned out to be due to this
|
||||
1-cycle difference!
|
||||
|
||||
### Better encoding performance
|
||||
|
||||
The encoder is written in Python and is about 30x slower than real-time at a reasonable quality level. Further
|
||||
optimizations are possible but rewriting in e.g. C++ should give a large performance boost.
|
||||
|
||||
### Better quality?
|
||||
|
||||
We can tick the speaker more frequently than 10 cycles using a couple of methods:
|
||||
|
||||
- chaining multiple STA $C030 together, e.g. to give a 4/.../4/4/10 cadence.
|
||||
|
||||
- by exploiting 6502 opcodes that repeatedly access memory during execution, including "false reads". During the course
|
||||
of executing a 6502 opcode, the CPU may access memory locations multiple times (up to 4 times, during successive clock
|
||||
cycles). This would give additional options for (partial) control of the speaker in the <10-cycle period regime.
|
||||
|
||||
Early results suggest that using these exotic opcode variants (e.g. INC $C030) may give a quality boost.
|
||||
|
||||
### Measure speaker time constants
|
||||
|
||||
It would be interesting to measure the time constant of the speaker circuit directly (e.g. via oscilloscope) instead
|
||||
of tuning by ear by picking a value whose output "sounds best".
|
||||
|
||||
Different Apple II models may well have different speaker characteristics - so far I've only tested on a single //e.
|
||||
|
||||
### In-memory playback
|
||||
|
||||
This level of audio quality requires high bit rate, about 85KB/sec. So 1 minute of audio requires about 5MB of data.
|
||||
This level of audio quality requires high bit rate, about 92KB/sec. So 1 minute of audio requires about 5.5MB of data.
|
||||
|
||||
A "Slinky" style memory card (RamFactor etc) uses a very similar I/O mechanism to the Uthernet II, i.e a $C0xx address
|
||||
that auto-increments through the onboard memory space. So it should be straightforward to extend ][-Sound to support
|
||||
RamFactor playback (I don't have one though).
|
||||
RamFactor playback.
|
||||
|
||||
Playback from bank-switched memory (e.g. RamWorks) should also be feasible, though would require a small amount of
|
||||
extra code to add the player opcode to switch banks.
|
||||
|
||||
The other option is to reduce bitrate (and therefore audio quality). Existing in-memory delta modulation players exist,
|
||||
e.g. Oliver Schmidt's [PLAY.BTC](https://github.com/oliverschmidt/Play-BTc), though tooling for producing well-optimized
|
||||
audio data for them did not exist. It should be possible to adapt the ][-sound encoder to produce better-quality audio
|
||||
for these existing players.
|
||||
The other option is to reduce bitrate (and therefore audio quality). I think it should also be possible to improve
|
||||
in-memory playback quality at similar bitrate, through using some of the cycle-level targeting techniques (though
|
||||
probably not at full 1-cycle resolution).
|
||||
|
||||
I think it should also be possible to improve in-memory playback quality at similar bitrate, through using some of the
|
||||
cycle-level targeting techniques (though perhaps not at full 1-cycle resolution).
|
||||
## 6502 support
|
||||
|
||||
The player relies heavily on the JMP (indirect) 6502 opcode, which has a different cycle count on the 6502 (5 cycles)
|
||||
and 65c02 (6 cycles). This means the player will be about 10% **faster** on a 6502 (e.g. II+, Unenhanced //e), but
|
||||
audio quality will be off until the encoder is made aware of this and able to compensate.
|
||||
|
||||
This might be one of the few pieces of software for which a 65c02 at the same clock speed causes a measurable
|
||||
performance degradation (adding almost a minute to playback of an 8-minute song - hat tip to Scott Duensing who noticed
|
||||
that my sample audio sounded "a tad slow", which turned out to be due to hearing this 1-cycle timing difference!
|
||||
|
|
475
encode_audio.py
475
encode_audio.py
|
@ -1,170 +1,281 @@
|
|||
#!/usr/bin/env python3
|
||||
# Delta modulation audio encoder.
|
||||
# Delta modulation audio encoder for playback via Uthernet II streaming.
|
||||
#
|
||||
# Simulates the Apple II speaker at 1MHz (i.e. cycle-level) resolution,
|
||||
# by modeling it as an RC circuit with given time constant. In order to
|
||||
# reproduce a target audio waveform, we upscale it to 1MHz sample rate,
|
||||
# and compute the sequence of player opcodes to best reproduce this waveform.
|
||||
# by modeling it as a damped harmonic oscillator.
|
||||
#
|
||||
# Since the player opcodes are chosen to allow ticking the speaker during any
|
||||
# given clock cycle (though with some limits on the minimum time
|
||||
# between ticks), this means that we are able to control the Apple II speaker
|
||||
# with cycle-level precision, which results in high audio fidelity with low
|
||||
# noise.
|
||||
# On the Apple II side we use an audio player that is able to toggle the
|
||||
# speaker with 1MHz precision, i.e. on any CPU clock cycle, although with a
|
||||
# lower limit of 10 cycles between toggles (i.e. 102KHz maximum
|
||||
# frequency).
|
||||
#
|
||||
# In order to reproduce a target audio waveform, we upscale it to 1MHz sample
|
||||
# rate, i.e. to determine the desired speaker position at every CPU clock
|
||||
# cycle, and compute the sequence of player operations on the Apple II side to
|
||||
# best reproduce this waveform.
|
||||
#
|
||||
# This means that we are able to control the Apple II speaker with cycle-level
|
||||
# precision, which results in high audio fidelity with low noise.
|
||||
#
|
||||
# To further optimize the audio quality we look ahead some defined number of
|
||||
# cycles and choose a speaker trajectory that minimizes errors over this range.
|
||||
# e.g. this allows us to anticipate large amplitude changes by pre-moving
|
||||
# the speaker to better approximate them.
|
||||
#
|
||||
# This also needs to take into account scheduling the "slow path" opcode every
|
||||
# 2048 output bytes, where the Apple II will manage the TCP socket buffer while
|
||||
# ticking the speaker at a regular cadence of 13 cycles to keep it in a
|
||||
# net-neutral position. When looking ahead we can also (partially)
|
||||
# compensate for this "dead" period by pre-positioning.
|
||||
# This also needs to take into account scheduling the "end of frame" opcode
|
||||
# every 2048 output bytes, where the Apple II will manage the TCP socket buffer
|
||||
# while ticking the speaker at a regular (a, b) cadence to attempt to
|
||||
# continue tracking the waveform as best we can. Since we are stepping away
|
||||
# from cycle-level management of the speaker during this period, it does
|
||||
# introduce some quality degradation (manifesting as a slight background
|
||||
# "crackle" to the audio)
|
||||
|
||||
import argparse
|
||||
import collections
|
||||
import contextlib
|
||||
import functools
|
||||
import sys
|
||||
import librosa
|
||||
import numpy
|
||||
import soundfile as sf
|
||||
from eta import ETA
|
||||
from typing import Tuple
|
||||
|
||||
import lookahead
|
||||
import opcodes
|
||||
import opcodes_generated
|
||||
|
||||
# How many bytes to use per frame in the audio stream. At the end of each
|
||||
# frame we need to switch to special end-of-frame operations to cause the
|
||||
# Apple II to manage the TCP socket buffers (ACK data received so far, and
|
||||
# check we have at least another frame of data available)
|
||||
#
|
||||
# With an 8KB socket buffer this seems to be about the maximum we can get away
|
||||
# with - it has to be page aligned, and 4KB causes stuttering even from a
|
||||
# local playback source.
|
||||
FRAME_SIZE = 2048
|
||||
|
||||
|
||||
# TODO: add flags to parametrize options
|
||||
class Speaker:
|
||||
"""Simulates the response of the Apple II speaker."""
|
||||
|
||||
# TODO: move lookahead.evolve into Speaker method
|
||||
|
||||
@functools.lru_cache(None)
|
||||
def _delta_powers(shape, step_size: int) -> Tuple[float, numpy.ndarray]:
|
||||
delta = (1 - 1 / step_size)
|
||||
return delta, numpy.cumprod(numpy.full(shape, delta), axis=-1)
|
||||
def __init__(self, sample_rate: float, freq: float, damping: float,
|
||||
scale: float):
|
||||
"""Initialize the Speaker object
|
||||
|
||||
:arg sample_rate The sample rate of the simulated speaker (Hz)
|
||||
:arg freq The resonant frequency of the speaker
|
||||
:arg damping The exponential decay factor of the speaker response
|
||||
:arg scale Scale factor to normalize speaker position to desired range
|
||||
"""
|
||||
self.sample_rate = sample_rate
|
||||
self.freq = freq
|
||||
self.damping = damping
|
||||
self.scale = numpy.float64(scale) # TODO: analytic expression
|
||||
|
||||
def lookahead(step_size: int, initial_position: float, data: numpy.ndarray,
|
||||
offset: int, voltages: numpy.ndarray):
|
||||
"""Evaluate effects of multiple potential opcode sequences and pick best.
|
||||
# See _Signal Processing in C_, C. Reid, T. Passin
|
||||
# https://archive.org/details/signalprocessing0000reid/
|
||||
dt = numpy.float64(1 / sample_rate)
|
||||
w = numpy.float64(freq * 2 * numpy.pi * dt)
|
||||
|
||||
We simulate the speaker voltage trajectory resulting from applying multiple
|
||||
voltage profiles, compute the resulting squared error relative to the
|
||||
target waveform, and pick the best one.
|
||||
d = damping * dt
|
||||
e = numpy.exp(d)
|
||||
c1 = 2 * e * numpy.cos(w)
|
||||
c2 = e * e
|
||||
|
||||
We use numpy to vectorize the computation since it has better scaling
|
||||
performance with more opcode choices, although also has a larger fixed
|
||||
overhead.
|
||||
"""
|
||||
# The speaker position p_i evolves according to
|
||||
# p_{i+1} = p_i + (v_i - p_i) / s
|
||||
# where v_i is the i'th applied voltage, s is the speaker step size
|
||||
#
|
||||
# Rearranging, we get p_{i+1} = v_i / s + (1-1/s) p_i
|
||||
# and if we expand the recurrence relation
|
||||
# p_{i+1} = Sum_{j=0}^i (1-1/s)^(i-j) v_j / s + (1-1/s)^(i+1) p_0
|
||||
# = (1-1/s)^(i+1)(1/s * Sum_{j=0}^i v_j / (1-1/s)^(j+1) + p0)
|
||||
delta, delta_powers = _delta_powers(voltages.shape, step_size)
|
||||
# Square wave impulse response parameters
|
||||
b2 = 0.0
|
||||
b1 = 1.0
|
||||
|
||||
positions = delta_powers * (
|
||||
numpy.cumsum(voltages / delta_powers, axis=1) / step_size +
|
||||
initial_position)
|
||||
total_error = numpy.sum(
|
||||
numpy.square(positions - data[offset:offset + voltages.shape[1]]),
|
||||
axis=1)
|
||||
self.c1 = c1
|
||||
self.c2 = c2
|
||||
self.b1 = b1
|
||||
self.b2 = b2
|
||||
|
||||
best = numpy.argmin(total_error)
|
||||
return best
|
||||
def total_error(positions: numpy.ndarray, data: numpy.ndarray) -> numpy.ndarray:
|
||||
"""Computes the total squared error for speaker position matrix vs data."""
|
||||
|
||||
|
||||
# TODO: Merge with lookahead
|
||||
def evolve(opcode: opcodes.Opcode, starting_position, starting_voltage,
|
||||
step_size, data, starting_idx):
|
||||
"""Apply the effects of playing a single opcode to completion.
|
||||
|
||||
Returns new state.
|
||||
"""
|
||||
opcode_length = opcodes.cycle_length(opcode)
|
||||
voltages = starting_voltage * opcodes.VOLTAGE_SCHEDULE[opcode]
|
||||
delta, delta_powers = _delta_powers(opcode_length, step_size)
|
||||
|
||||
positions = delta_powers * (
|
||||
numpy.cumsum(voltages / delta_powers) / step_size +
|
||||
starting_position)
|
||||
|
||||
# TODO: compute error once at the end?
|
||||
total_err = numpy.sum(numpy.square(
|
||||
positions - data[starting_idx:starting_idx + opcode_length]))
|
||||
return positions[-1], voltages[-1], total_err, starting_idx + opcode_length
|
||||
# Deal gracefully with the case where our speaker operation would slightly
|
||||
# run past the end of data
|
||||
min_len = min(len(positions), len(data))
|
||||
return numpy.sum(numpy.square(positions[:min_len] - data[:min_len]),
|
||||
axis=-1)
|
||||
|
||||
|
||||
@functools.lru_cache(None)
|
||||
def frame_horizon(frame_offset: int, lookahead_steps: int):
|
||||
"""Optimize frame_offset when we're not within lookahead_steps of slowpath.
|
||||
"""Optimize frame_offset when more than lookahead_steps from end of frame.
|
||||
|
||||
When computing candidate opcodes, all frame offsets are the same until the
|
||||
end-of-frame slowpath comes within our lookahead horizon.
|
||||
Candidate opcodes for all values of frame_offset are equal, until the
|
||||
end-of-frame opcode comes within our lookahead horizon. This avoids
|
||||
needing to recompute many copies of the same candidate opcodes.
|
||||
|
||||
TODO: this is a bit of a hack and we should be able to make the candidate
|
||||
opcode selection itself smarter about avoiding duplicate work
|
||||
"""
|
||||
if frame_offset < (2047 - lookahead_steps):
|
||||
# TODO: This could be made tighter because a step is always at least 5
|
||||
# cycles towards lookahead_steps.
|
||||
if frame_offset < (FRAME_SIZE - lookahead_steps):
|
||||
return 0
|
||||
return frame_offset
|
||||
|
||||
|
||||
def audio_bytestream(data: numpy.ndarray, step: int, lookahead_steps: int):
|
||||
def audio_bytestream(data: numpy.ndarray, step: int, lookahead_steps: int,
|
||||
sample_rate: int):
|
||||
"""Computes optimal sequence of player opcodes to reproduce audio data."""
|
||||
# At resonance freq the scale is about 22400 but we can only access about 7%
|
||||
# of it across the frequency range. This is also the equilibrium speaker
|
||||
# position when voltage is held constant. Normalize to this working
|
||||
# range for convenience.
|
||||
inv_scale = 22400 * 0.07759626164027278 # XXX
|
||||
|
||||
dlen = len(data)
|
||||
# Speaker response parameters can be fitted in several ways. First, by
|
||||
# recording audio of
|
||||
# - a single speaker click (impulse response)
|
||||
# - a frequency sweep over the entire audible spectrum
|
||||
#
|
||||
# Resonant frequency can be read off from the frequency spectrum. For my
|
||||
# speaker there were two primary frequencies, at ~3875 and ~480Hz.
|
||||
# Looking at the click waveform the higher frequency mode dominates at
|
||||
# short time scales, and the lower frequency mode dominates at late
|
||||
# times. Since we're interested in short timescale speaker control we
|
||||
# can ignore the latter.
|
||||
#
|
||||
# Damping factor can be estimated by fitting against the speaker click
|
||||
# waveform or the spectrum, e.g. by simulating a speaker click and then
|
||||
# computing its spectrum.
|
||||
#
|
||||
# TODO: other Apple II speakers almost certainly have different response
|
||||
# characteristics, but hopefully not too widely varying.
|
||||
sp = Speaker(sample_rate, freq=3875, damping=-1210, scale=1 / inv_scale)
|
||||
|
||||
# Starting speaker applied voltage.
|
||||
voltage1 = voltage2 = 1.0
|
||||
|
||||
# last 2 speaker positions.
|
||||
# XXX 0.0?
|
||||
y1 = y2 = 1.0
|
||||
|
||||
# Leave enough padding at the end to look ahead from the last data value,
|
||||
# and in case we schedule an end-of-frame opcode towards the end.
|
||||
# TODO: avoid temporarily doubling memory footprint to concatenate
|
||||
data = numpy.concatenate(
|
||||
[data, numpy.zeros(lookahead_steps, dtype=numpy.float32)])
|
||||
data = numpy.ascontiguousarray(numpy.concatenate(
|
||||
[data, numpy.zeros(max(lookahead_steps, opcodes.cycle_length(
|
||||
opcodes_generated.PlayerOps.TICK_00)), dtype=numpy.float32)]))
|
||||
|
||||
voltage = -1.0
|
||||
position = -1.0
|
||||
|
||||
# Pre-warm cache so we don't skew ETA during encoding
|
||||
for i in range(2048):
|
||||
_, _ = opcodes.candidate_opcodes(frame_horizon(i, lookahead_steps),
|
||||
lookahead_steps)
|
||||
|
||||
total_err = 0.0
|
||||
frame_offset = 0
|
||||
eta = ETA(total=1000)
|
||||
# index within input audio data
|
||||
i = 0
|
||||
last_updated = 0
|
||||
# Position in 2048-byte TCP frame
|
||||
frame_offset = 0
|
||||
|
||||
# Total squared error of audio output
|
||||
total_err = 0.0
|
||||
|
||||
# Keep track of how many large deviations we see from the target waveform
|
||||
# as another measure of audio quality
|
||||
clicks = 0
|
||||
# total squared error threshold to consider an operation as producing a
|
||||
# click
|
||||
click_threshold = 0.3
|
||||
|
||||
# Keep track of how many opcodes we schedule, so we can print summary
|
||||
# statistics at the end
|
||||
opcode_counts = collections.defaultdict(int)
|
||||
|
||||
while i < dlen:
|
||||
if (i - last_updated) > int((dlen / 1000)):
|
||||
# Always look ahead at least this many cycles. We pick a higher value
|
||||
# when approaching end of frame, so we can maximize the
|
||||
min_lookahead_steps = lookahead_steps
|
||||
|
||||
# Progress tracker
|
||||
# TODO: find a more adaptive ETA tracker, this one doesn't estimate well
|
||||
# if the processing rate changes (which it does for us, since first few
|
||||
# steps do extra work to precompute values that are cached for later
|
||||
# steps)
|
||||
eta = ETA(total=1000, min_ms_between_updates=0)
|
||||
# Value of i at which we should next update eta
|
||||
next_eta_tick = 0
|
||||
|
||||
while i < len(data):
|
||||
if i >= next_eta_tick:
|
||||
eta.print_status()
|
||||
last_updated = i
|
||||
next_eta_tick = int(eta.i * len(data) / 1000)
|
||||
|
||||
candidate_opcodes, voltages = opcodes.candidate_opcodes(
|
||||
frame_horizon(frame_offset, lookahead_steps), lookahead_steps)
|
||||
opcode_idx = lookahead(step, position, data, i, voltage * voltages)
|
||||
opcode = candidate_opcodes[opcode_idx][0]
|
||||
if frame_offset >= (FRAME_SIZE - 5): # XXX
|
||||
lookahead_steps = min_lookahead_steps + 130 # XXX parametrize
|
||||
else:
|
||||
lookahead_steps = min_lookahead_steps
|
||||
|
||||
# The EOF opcodes need to act as a matched pair, so if we're emitting
|
||||
# the second one we need to pass in its predecessor
|
||||
last_opcode = opcode if frame_offset == FRAME_SIZE - 1 else None
|
||||
|
||||
# Compute all possible opcode sequences we could emit starting at this
|
||||
# frame offset
|
||||
next_candidate_opcodes, voltages, lookahead_steps = \
|
||||
opcodes.candidate_opcodes(
|
||||
frame_horizon(frame_offset, lookahead_steps),
|
||||
lookahead_steps, last_opcode)
|
||||
|
||||
# Simulate speaker trajectory for all of these candidate opcode
|
||||
# sequences and pick the one that minimizes total error
|
||||
opcode_idx = lookahead.evolve_return_best(
|
||||
sp, y1, y2, voltage1, voltage2, voltage1 * voltages,
|
||||
data[i:i + lookahead_steps])
|
||||
opcode = next_candidate_opcodes[opcode_idx]
|
||||
opcode_length = opcodes.cycle_length(opcode)
|
||||
opcode_counts[opcode] += 1
|
||||
yield opcode
|
||||
|
||||
position, voltage, new_error, i = evolve(
|
||||
opcode, position, voltage, step, data, i)
|
||||
# Apply this opcode to evolve the speaker position
|
||||
opcode_voltages = (voltage1 * opcode.voltages).reshape((1, -1))
|
||||
all_positions = lookahead.evolve(
|
||||
sp, y1, y2, voltage1, voltage2, opcode_voltages)
|
||||
|
||||
assert all_positions.shape[0] == 1
|
||||
assert all_positions.shape[1] == opcode_length
|
||||
|
||||
# Update to new speaker state
|
||||
voltage1 = opcode_voltages[0, -1]
|
||||
voltage2 = opcode_voltages[0, -2]
|
||||
y1 = all_positions[0, -1]
|
||||
y2 = all_positions[0, -2]
|
||||
|
||||
# Track accumulated error between desired and actual speaker trajectory
|
||||
new_error = total_error(
|
||||
all_positions[0] * sp.scale, data[i:i + opcode_length]).item()
|
||||
total_err += new_error
|
||||
frame_offset = (frame_offset + 1) % 2048
|
||||
if new_error > click_threshold:
|
||||
clicks += 1
|
||||
# XXX
|
||||
print(frame_offset, i / sample_rate, opcode, new_error,
|
||||
numpy.mean(data[i:i + opcode_length]))
|
||||
|
||||
for _ in range(frame_offset % 2048, 2047):
|
||||
yield opcodes.Opcode.NOTICK_6
|
||||
yield opcodes.Opcode.EXIT
|
||||
# Emit chosen operation and simulated audio samples for recording
|
||||
yield opcode, numpy.array(
|
||||
all_positions * sp.scale, dtype=numpy.float32).reshape(-1)
|
||||
|
||||
# Update input and output stream positions
|
||||
i += opcode_length
|
||||
frame_offset = (frame_offset + 1) % FRAME_SIZE
|
||||
|
||||
# Make sure we have at least 2k left in stream so the player will do a
|
||||
# complete read of the last frame.
|
||||
# for _ in range(frame_offset % 2048, 2048):
|
||||
# yield opcodes.Opcode.EXIT
|
||||
eta.done()
|
||||
print("Total error %f" % total_err)
|
||||
|
||||
# Print summary statistics
|
||||
print("Total error %f" % total_err)
|
||||
print("%d clicks" % clicks)
|
||||
print("Opcodes used:")
|
||||
for v, k in sorted(list(opcode_counts.items()), key=lambda kv: kv[1],
|
||||
reverse=True):
|
||||
print("%s: %d" % (v, k))
|
||||
|
||||
|
||||
def preprocess(
|
||||
filename: str, target_sample_rate: int, normalize: float = 0.5,
|
||||
normalization_percentile: int = 100) -> numpy.ndarray:
|
||||
def preprocess_audio(
|
||||
filename: str, target_sample_rate: int, normalize: float,
|
||||
normalization_percentile: int) -> numpy.ndarray:
|
||||
"""Upscale input audio to target sample rate and normalize signal."""
|
||||
|
||||
data, _ = librosa.load(filename, sr=target_sample_rate, mono=True)
|
||||
|
@ -176,24 +287,148 @@ def preprocess(
|
|||
return data
|
||||
|
||||
|
||||
def main(argv):
|
||||
serve_file = argv[1]
|
||||
step = int(argv[2])
|
||||
def downsample_audio(simulated_audio, original_audio, input_rate, output_rate,
|
||||
noise_output=False):
|
||||
"""Downscale the 1MHz simulated audio output suitable for writing as .wav
|
||||
|
||||
# TODO: if we're not looking ahead beyond the longest (non-slowpath) opcode
|
||||
# then this will reduce quality, e.g. a long NOTICK and TICK will
|
||||
# both look the same over a too-short horizon, but have different results.
|
||||
lookahead_steps = int(argv[3])
|
||||
out = argv[4]
|
||||
:arg simulated_audio The simulated audio data to downsample
|
||||
:arg original_audio The original audio data that was simulated
|
||||
:arg input_rate Sample rate of input audio
|
||||
:arg output_rate Desired sample rate of output audio
|
||||
:arg noise_output Whether to also produce a noise waveform, i.e. difference
|
||||
between input and output audio
|
||||
|
||||
# TODO: PAL Apple ][ clock rate is slightly different
|
||||
sample_rate = int(1024. * 1000)
|
||||
:returns Tuple of downsampled audio and noise data (or None
|
||||
if noise_output==False)
|
||||
"""
|
||||
downsampled_output = librosa.resample(
|
||||
numpy.array(simulated_audio, dtype=numpy.float32),
|
||||
orig_sr=input_rate,
|
||||
target_sr=output_rate)
|
||||
|
||||
with open(out, "wb+") as f:
|
||||
for opcode in audio_bytestream(
|
||||
preprocess(serve_file, sample_rate), step, lookahead_steps):
|
||||
f.write(bytes([opcode.value]))
|
||||
downsampled_noise = None
|
||||
if noise_output:
|
||||
noise_len = min(len(simulated_audio), len(original_audio))
|
||||
downsampled_noise = librosa.resample(
|
||||
numpy.array(
|
||||
simulated_audio[:noise_len] - original_audio[:noise_len]),
|
||||
orig_sr=input_rate,
|
||||
target_sr=output_rate)
|
||||
|
||||
return downsampled_output, downsampled_noise
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--clock", choices=['pal', 'ntsc'],
|
||||
help="Whether target machine clock speed is PAL ("
|
||||
"1015657Hz) or NTSC (1020484)",
|
||||
required=True)
|
||||
# TODO: implement 6502 - JMP indirect takes 5 cycles instead of 6
|
||||
parser.add_argument("--step_size", type=int,
|
||||
help="Delta encoding step size")
|
||||
# TODO: if we're not looking ahead beyond the longest (non-end-of-frame)
|
||||
# opcode then this will reduce quality, e.g. two opcodes may truncate to
|
||||
# the same prefix, but have different results when we apply them
|
||||
# fully.
|
||||
parser.add_argument("--lookahead_cycles", type=int,
|
||||
help="Number of clock cycles to look ahead in audio "
|
||||
"stream.")
|
||||
parser.add_argument("--normalization", default=0.8, type=float,
|
||||
help="Overall multiplier to rescale input audio "
|
||||
"values.")
|
||||
parser.add_argument("--norm_percentile", default=100,
|
||||
help="Normalize to specified percentile value of input "
|
||||
"audio")
|
||||
parser.add_argument("--wav_output", type=str, help="output audio file")
|
||||
parser.add_argument("--noise_output", type=str, help="output audio file")
|
||||
parser.add_argument("input", type=str, help="input audio file to convert")
|
||||
parser.add_argument("output", type=str, help="output audio file")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Effective clock rate, including every-65 cycle "long cycle" that takes
|
||||
# 16/14 as long.
|
||||
cpu_clock_rate = 1015657 if args.clock == 'pal' else 1020484 # NTSC
|
||||
|
||||
input_audio = preprocess_audio(
|
||||
args.input, cpu_clock_rate, args.normalization, args.norm_percentile)
|
||||
print("Done preprocessing audio")
|
||||
|
||||
# Sample rate for output .wav files
|
||||
# TODO: flag
|
||||
output_rate = 44100
|
||||
|
||||
# Buffers simulated audio output so we can downsample it in suitably
|
||||
# large chunks for writing to the output .wav file
|
||||
output_buffer = []
|
||||
|
||||
# Python contexts for writing output files if requested
|
||||
opcode_context = open(args.output, "wb+")
|
||||
if args.wav_output:
|
||||
wav_context = sf.SoundFile(
|
||||
args.wav_output, "w", output_rate, channels=1, format='WAV')
|
||||
else:
|
||||
# We're not creating a file but still need a context
|
||||
# XXX does this work?
|
||||
wav_context = contextlib.nullcontext
|
||||
if args.noise_output:
|
||||
noise_context = sf.SoundFile(
|
||||
args.noise_output, "w", output_rate, channels=1,
|
||||
format='WAV')
|
||||
else:
|
||||
# We're not creating a file but still need a context
|
||||
noise_context = contextlib.nullcontext
|
||||
|
||||
with wav_context as wav_f, noise_context as noise_f, opcode_context \
|
||||
as opcode_f:
|
||||
# Tracks current position in input audio waveform
|
||||
input_offset = 0
|
||||
|
||||
# Process input audio, writing output to ][-Sound audio file
|
||||
# and (if requested) .wav files of simulated speaker audio and
|
||||
# noise (difference between original and simulated audio)
|
||||
for idx, sample_data in enumerate(audio_bytestream(
|
||||
input_audio, args.step_size, args.lookahead_cycles,
|
||||
cpu_clock_rate)):
|
||||
opcode, samples = sample_data
|
||||
opcode_f.write(bytes([opcode.byte]))
|
||||
|
||||
output_buffer.extend(samples)
|
||||
input_offset += len(samples)
|
||||
# Keep accumulating as long as we have <1MB in the buffer, or are
|
||||
# within 1MB from the end. This ensures we have enough samples to
|
||||
# downsample, including the last (partial) buffer.
|
||||
if (
|
||||
len(output_buffer) < 1 * 1024 * 1024 or (
|
||||
len(input_audio) - input_offset) < 1 * 1024 * 1024
|
||||
):
|
||||
continue
|
||||
|
||||
# TODO: don't bother computing if we're not writing wavs
|
||||
downsampled_audio, downsampled_noise = downsample_audio(
|
||||
output_buffer, input_audio[input_offset - len(output_buffer):],
|
||||
cpu_clock_rate, output_rate, bool(args.noise_output)
|
||||
)
|
||||
if args.wav_output:
|
||||
wav_f.write(downsampled_audio)
|
||||
wav_f.flush()
|
||||
if args.noise_output:
|
||||
noise_f.write(downsampled_noise)
|
||||
noise_f.flush()
|
||||
|
||||
output_buffer = []
|
||||
|
||||
# TODO: handle last buffer more cleanly than duplicating this code
|
||||
if output_buffer:
|
||||
downsampled_audio, downsampled_noise = downsample_audio(
|
||||
output_buffer, input_audio[input_offset - len(output_buffer):],
|
||||
cpu_clock_rate, output_rate, bool(args.noise_output)
|
||||
)
|
||||
if args.wav_output:
|
||||
wav_f.write(downsampled_audio)
|
||||
if args.noise_output:
|
||||
noise_f.write(downsampled_noise)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
||||
main()
|
||||
|
|
BIN
examples/adventure.a2s.bz2
Normal file
BIN
examples/adventure.a2s.bz2
Normal file
Binary file not shown.
Binary file not shown.
597
generate_player.py
Normal file
597
generate_player.py
Normal file
|
@ -0,0 +1,597 @@
|
|||
import itertools
|
||||
import numpy
|
||||
from typing import Iterable, List, Tuple, Dict
|
||||
|
||||
import opcodes_6502
|
||||
import player_op
|
||||
|
||||
|
||||
def audio_opcodes() -> Iterable[Tuple[opcodes_6502.Opcode]]:
|
||||
# These two basic sequences let us chain together STA $C030 with any number
|
||||
# >= 10 of intervening cycles We don't need to explicitly
|
||||
# include 6 or more cycles of NOP because those can be obtained by chaining
|
||||
# together JMP (WDATA) to itself
|
||||
yield tuple(
|
||||
[nop for nop in opcodes_6502.nops(4)] + [
|
||||
opcodes_6502.STA_C030, opcodes_6502.JMP_WDATA])
|
||||
|
||||
yield tuple(
|
||||
[nop for nop in opcodes_6502.nops(4)] + [
|
||||
opcodes_6502.Opcode(5, 3, "STA $BFFF,Y", toggle=True),
|
||||
opcodes_6502.JMP_WDATA])
|
||||
|
||||
|
||||
def duty_cycle_range():
|
||||
cycles = []
|
||||
for i in range(4, 42):
|
||||
if i == 5:
|
||||
# No single-cycle instructions
|
||||
# TODO: use STA $BFFF,X(=31) as a 5-cycle instruction. This would
|
||||
# be tricky since it requires maintaining X=31 across arbitrary
|
||||
# code interleaving
|
||||
continue
|
||||
cycles.append(i)
|
||||
|
||||
return cycles
|
||||
|
||||
|
||||
def eof_trampoline_stage1(cycles):
|
||||
ops = [
|
||||
opcodes_6502.Literal(
|
||||
"eof_trampoline_%d:" % cycles, indent=0
|
||||
),
|
||||
opcodes_6502.STA_C030,
|
||||
]
|
||||
if cycles == 4:
|
||||
return ops + [
|
||||
opcodes_6502.STA_C030,
|
||||
opcodes_6502.Opcode(3, 3, "JMP eof_trampoline_%d_stage2" % cycles)
|
||||
]
|
||||
if cycles == 5:
|
||||
return None
|
||||
if cycles == 6:
|
||||
return ops + [
|
||||
opcodes_6502.Opcode(2, 1, "NOP"),
|
||||
opcodes_6502.STA_C030,
|
||||
opcodes_6502.Opcode(3, 3, "JMP eof_trampoline_%d_stage2" % cycles)
|
||||
]
|
||||
if cycles == 8:
|
||||
return ops + [
|
||||
opcodes_6502.Opcode(2, 1, "NOP"),
|
||||
opcodes_6502.Opcode(2, 1, "NOP"),
|
||||
opcodes_6502.STA_C030,
|
||||
opcodes_6502.Opcode(3, 3, "JMP eof_trampoline_%d_stage2" % cycles)
|
||||
]
|
||||
return ops + [
|
||||
opcodes_6502.Opcode(3, 3, "JMP eof_trampoline_%d_stage2" % cycles)
|
||||
]
|
||||
|
||||
|
||||
EOF_TRAMPOLINE_STAGE1 = {
|
||||
a: eof_trampoline_stage1(a) for a in duty_cycle_range()
|
||||
}
|
||||
|
||||
|
||||
def eof_trampoline_stage2(cycles) -> List[opcodes_6502.Opcode]:
|
||||
label: List[opcodes_6502.Opcode] = [
|
||||
opcodes_6502.Literal(
|
||||
"eof_trampoline_%d_stage2:" % cycles, indent=0
|
||||
)
|
||||
]
|
||||
|
||||
ops = [
|
||||
opcodes_6502.Opcode(4, 3, "LDA WDATA"),
|
||||
opcodes_6502.Opcode(4, 3, "STA @0+1"),
|
||||
opcodes_6502.Opcode(
|
||||
6, 3, "JMP (eof_trampoline_%d_stage3_page)" % cycles)
|
||||
]
|
||||
if cycles < 7 or cycles == 8:
|
||||
return label + ops[:-1] + [opcodes_6502.Literal("@0:", indent=0)] + [
|
||||
ops[-1]]
|
||||
|
||||
# For cycles == 7 or > 8 we need to interleave a STA $C030 into stage 2
|
||||
# because we couldn't fit it in stage 1
|
||||
interleave_ops = [
|
||||
opcodes_6502.padding(cycles - 7),
|
||||
opcodes_6502.STA_C030,
|
||||
opcodes_6502.padding(100)
|
||||
]
|
||||
res = label + list(opcodes_6502.interleave_opcodes(interleave_ops, ops))
|
||||
# We can't insert the label before interleaving because we might have
|
||||
# NOP/STA inserted after it
|
||||
# TODO: this is a bit of a hack - add support for binding the literal to
|
||||
# the following opcode so it can't be split
|
||||
return res[:-1] + [opcodes_6502.Literal("@0:", indent=0)] + [res[-1]]
|
||||
|
||||
|
||||
EOF_TRAMPOLINE_STAGE2 = {
|
||||
a: eof_trampoline_stage2(a) for a in duty_cycle_range()
|
||||
}
|
||||
|
||||
|
||||
def cycles_after_tick(ops: Iterable[opcodes_6502.Opcode]) -> int:
|
||||
cycles = 0
|
||||
ticks = 0
|
||||
for op in ops:
|
||||
cycles += op.cycles
|
||||
if op.toggle:
|
||||
cycles = 0
|
||||
ticks += 1
|
||||
return cycles, ticks
|
||||
|
||||
|
||||
STAGE1_CYCLES_AFTER_TICK = {
|
||||
a: cycles_after_tick(EOF_TRAMPOLINE_STAGE1[a]) for a in duty_cycle_range()
|
||||
}
|
||||
|
||||
STAGE2_CYCLES_AFTER_TICK = {
|
||||
a: cycles_after_tick(EOF_TRAMPOLINE_STAGE2[a]) for a in duty_cycle_range()
|
||||
}
|
||||
|
||||
|
||||
def _duty_cycles(duty_cycles):
|
||||
# The player sequence for periods of silence (i.e. 0-valued waveform)
|
||||
# is a sequence of 10 cycle ticks, so we need to support maintaining
|
||||
# this during EOF in order to avoid introducing noise during such periods.
|
||||
# XXX
|
||||
res = {}
|
||||
|
||||
for i in duty_cycles:
|
||||
for j in duty_cycles:
|
||||
# We only need to worry about i <= j because we can effectively
|
||||
# obtain the opposite cadence by inserting an extra half duty cycle
|
||||
# before the EOF
|
||||
# XXX try again removing this, we have space
|
||||
if j <= i:
|
||||
continue
|
||||
|
||||
# Limit to min 22Khz carrier
|
||||
if (i + j) > 45:
|
||||
continue
|
||||
|
||||
# When first duty cycle is small enough to fit in the stage 1
|
||||
# trampoline, we can't fit the second duty cycle in the stage 2
|
||||
# trampoline because we'd need too may stage 1 variants to fit in
|
||||
# page 3. That sets a lower bound on the second duty cycle.
|
||||
#
|
||||
# e.g.
|
||||
#
|
||||
# eof_trampoline_4:
|
||||
# STA $C030 ; 4 cycles
|
||||
# STA $C030 ; 4 cycles
|
||||
# JMP eof_trampoline_4_stage2 ; 3 cycles
|
||||
#
|
||||
# eof_trampoline_4_stage2:
|
||||
# LDA WDATA ; 4
|
||||
# STA @0+1 ; 4
|
||||
# @0: JMP (xxyy) ; 6
|
||||
#
|
||||
# eof_trampoline_4_b_stage3:
|
||||
# ; second duty cycle must land here, i.e the earliest it can
|
||||
# ; be is 3 + 4 + 4 + 6 + 4 = 21 cycles
|
||||
# ; It can't be 22 cycles though because there are no 1-cycle
|
||||
# ; operations
|
||||
if i in {4, 6, 8}:
|
||||
if j < 21 or j == 22:
|
||||
continue
|
||||
else:
|
||||
# stage 1 is STA $C030; JMP stage_2
|
||||
stage_1_cycles, stage_1_ticks = STAGE1_CYCLES_AFTER_TICK[i]
|
||||
assert (stage_1_cycles, stage_1_ticks) == (3, 1)
|
||||
|
||||
stage_2_cycles, stage_2_ticks = STAGE2_CYCLES_AFTER_TICK[i]
|
||||
# the earliest the second duty cycle can complete is a
|
||||
# STA $c030 at the beginning of stage 3
|
||||
if stage_2_ticks:
|
||||
min_cycles = stage_2_cycles + 4
|
||||
else:
|
||||
min_cycles = stage_1_cycles + stage_2_cycles + 4
|
||||
|
||||
if j < min_cycles or j == min_cycles + 1:
|
||||
continue
|
||||
|
||||
duty = j / (i + j) * 2 - 1
|
||||
res.setdefault(duty, []).append((i + j, i, j))
|
||||
|
||||
cycles = []
|
||||
for c in sorted(list(res.keys())):
|
||||
pair = sorted(res[c], reverse=False)[0][1:]
|
||||
cycles.append(pair)
|
||||
print(c, pair)
|
||||
|
||||
return sorted(cycles)
|
||||
|
||||
|
||||
# Excludes special (10,10) cycle that we hand-craft
|
||||
EOF_DUTY_CYCLES = _duty_cycles(duty_cycle_range())
|
||||
|
||||
|
||||
def eof_trampoline_stage3_page_offsets(duty_cycles):
|
||||
second_cycles = {}
|
||||
for a, b in sorted(duty_cycles):
|
||||
second_cycles.setdefault(a, []).append(b)
|
||||
|
||||
# bin-pack the (a, b) duty cycles into pages so that we can set up indirect
|
||||
# jump tables to dispatch the third stage trampoline. A greedy algorithm
|
||||
# works fine here
|
||||
pages = []
|
||||
page = []
|
||||
longest_first_cycles = sorted(
|
||||
list(second_cycles.items()), key=lambda c: len(c[1]), reverse=True)
|
||||
left = len(longest_first_cycles)
|
||||
while left:
|
||||
for i, cycles in enumerate(longest_first_cycles):
|
||||
if cycles is None:
|
||||
continue
|
||||
cycle1, cycles2 = cycles
|
||||
if len(page) <= (128 - len(cycles2)):
|
||||
page.extend((cycle1, cycle2) for cycle2 in cycles2)
|
||||
longest_first_cycles[i] = None
|
||||
left -= 1
|
||||
pages.append(page)
|
||||
page = []
|
||||
|
||||
page_offsets = {}
|
||||
for page_idx, page in enumerate(pages):
|
||||
offset = 0
|
||||
for a, b in page:
|
||||
page_offsets[(a, b)] = (page_idx, offset)
|
||||
offset += 2
|
||||
|
||||
return page_offsets
|
||||
|
||||
|
||||
EOF_TRAMPOLINE_STAGE3_PAGE_OFFSETS = eof_trampoline_stage3_page_offsets(
|
||||
EOF_DUTY_CYCLES)
|
||||
|
||||
EOF_STAGE_3_BASE = [
|
||||
opcodes_6502.Literal(
|
||||
"; We've read exactly 2KB from the socket buffer. Before continuing "
|
||||
"we need to ACK this read,"),
|
||||
opcodes_6502.Literal(
|
||||
"; and make sure there's at least another 2KB in the buffer."),
|
||||
opcodes_6502.Literal(";"),
|
||||
opcodes_6502.Literal(
|
||||
"; Save the W5100 address pointer so we can continue reading the "
|
||||
"socket buffer once we are done."),
|
||||
opcodes_6502.Literal(
|
||||
"; We know the low-order byte is 0 because Socket RX memory is "
|
||||
"page-aligned and so is 2K frame."),
|
||||
opcodes_6502.Literal(
|
||||
"; IMPORTANT - from now on until we restore this below, we can't "
|
||||
"trash the Y register!"),
|
||||
opcodes_6502.Opcode(4, 3, "LDY WADRH"),
|
||||
opcodes_6502.Literal("; Update new Received Read pointer."),
|
||||
opcodes_6502.Literal(";"),
|
||||
opcodes_6502.Literal(
|
||||
"; We know we have received exactly 2KB, so we don't need to read the "
|
||||
"current value from the"),
|
||||
opcodes_6502.Literal(
|
||||
"; hardware. We can track it ourselves instead, which saves a "
|
||||
"few cycles."),
|
||||
opcodes_6502.Opcode(2, 2, "LDA #>S0RXRD"),
|
||||
opcodes_6502.Opcode(4, 3, "STA WADRH"),
|
||||
opcodes_6502.Opcode(2, 2, "LDA #<S0RXRD"),
|
||||
opcodes_6502.Opcode(4, 3, "STA WADRL"),
|
||||
opcodes_6502.Opcode(
|
||||
4, 3, "LDA RXRD ; TODO: in principle we could update RXRD outside of "
|
||||
"the EOF path"),
|
||||
opcodes_6502.Opcode(2, 1, "CLC"),
|
||||
opcodes_6502.Opcode(2, 2, "ADC #$08"),
|
||||
opcodes_6502.Opcode(
|
||||
4, 3, "STA WDATA ; Store new high byte of received read pointer"),
|
||||
opcodes_6502.Opcode(4, 3, "STA RXRD ; Save for next time"),
|
||||
opcodes_6502.Literal("; Send the Receive command"),
|
||||
opcodes_6502.Opcode(2, 2, "LDA #<S0CR"),
|
||||
opcodes_6502.Opcode(4, 3, "STA WADRL"),
|
||||
opcodes_6502.Opcode(2, 2, "LDA #SCRECV"),
|
||||
opcodes_6502.Opcode(4, 3, "STA WDATA"),
|
||||
opcodes_6502.Literal(
|
||||
"; Make sure we have at least 2KB more in the socket buffer so we can "
|
||||
"start another frame."
|
||||
),
|
||||
opcodes_6502.Opcode(2, 2, "LDA #$07"),
|
||||
opcodes_6502.Opcode(2, 2, "LDX #<S0RXRSR ; Socket 0 Received Size "
|
||||
"register"),
|
||||
opcodes_6502.Literal(
|
||||
"; we might loop an unknown number of times here waiting for data but "
|
||||
"the default should be to"),
|
||||
opcodes_6502.Literal("; fall straight through"),
|
||||
opcodes_6502.Literal("@0:", indent=0),
|
||||
opcodes_6502.Opcode(4, 3, "STX WADRL"),
|
||||
opcodes_6502.Opcode(4, 3, "CMP WDATA ; High byte of received size"),
|
||||
opcodes_6502.Opcode(
|
||||
2, 2,
|
||||
"BCS @0 ; 2 cycles in common case when there is already sufficient "
|
||||
"data waiting."),
|
||||
opcodes_6502.Literal(
|
||||
"; We're good to go for another frame. Restore W5100 address pointer "
|
||||
"where we last found it, to"),
|
||||
opcodes_6502.Literal(
|
||||
"; begin iterating through the next 2KB of the socket buffer."),
|
||||
opcodes_6502.Literal(";"),
|
||||
opcodes_6502.Literal(
|
||||
"; It turns out that the W5100 automatically wraps the address pointer "
|
||||
"at the end of the 8K"),
|
||||
opcodes_6502.Literal(
|
||||
"; RX/TX buffers. Since we're using an 8K socket, that means we don't "
|
||||
"have to do any work to"),
|
||||
opcodes_6502.Literal("; manage the read pointer!"),
|
||||
opcodes_6502.Opcode(4, 3, "STY WADRH"),
|
||||
opcodes_6502.Opcode(2, 2, "LDA #$00"),
|
||||
opcodes_6502.Opcode(4, 3, "STA WADRL"),
|
||||
opcodes_6502.Opcode(2, 2, "LDY #$31"),
|
||||
opcodes_6502.Opcode(6, 3, "JMP (WDATA)"),
|
||||
]
|
||||
|
||||
|
||||
def validate_stage_3_ops(op_seq, a, b):
|
||||
voltages = opcodes_6502.join_voltages(op_seq)
|
||||
toggle_cadence = itertools.chain([4], itertools.cycle([a, b]))
|
||||
last = 1.0
|
||||
expected_count = next(toggle_cadence)
|
||||
# print(op_seq, a, b)
|
||||
for t in voltages:
|
||||
expected_count -= 1
|
||||
# print(expected_count, t)
|
||||
if t != last:
|
||||
assert expected_count == 0
|
||||
expected_count = next(toggle_cadence)
|
||||
last = t
|
||||
|
||||
|
||||
EOF_STAGE1_10_10_OPS = [
|
||||
opcodes_6502.Literal("eof_trampoline_10_10:", indent=0),
|
||||
opcodes_6502.STA_C030,
|
||||
opcodes_6502.Opcode(3, 3, "JMP eof_stage_2_10_10")
|
||||
]
|
||||
|
||||
EOF_STAGE2_10_10_BASE = (
|
||||
[
|
||||
opcodes_6502.Literal("eof_stage_2_10_10:",
|
||||
indent=0),
|
||||
opcodes_6502.Opcode(4, 3,
|
||||
"LDA WDATA ; dummy read to maintain framing"),
|
||||
] + EOF_STAGE_3_BASE
|
||||
)
|
||||
|
||||
|
||||
def generate_player(
|
||||
opcode_filename: str,
|
||||
player_stage1_filename: str,
|
||||
player_stage2_filename: str,
|
||||
player_stage3_table_filename: str
|
||||
):
|
||||
# Generate assembly code for page 3 operations
|
||||
with open(player_stage1_filename, "w+") as f:
|
||||
# Audio operations
|
||||
audio_player_ops: Dict[str, player_op.PlayerOp] = {}
|
||||
page_3_offset = 0
|
||||
seen_op_suffix_voltages = set()
|
||||
for i, ops in enumerate(audio_opcodes()):
|
||||
player_ops = []
|
||||
# Generate unique entrypoints
|
||||
for j, op in enumerate(ops):
|
||||
op_suffix_voltages = opcodes_6502.voltages(ops[j:])
|
||||
if op_suffix_voltages not in seen_op_suffix_voltages:
|
||||
# new subsequence
|
||||
seen_op_suffix_voltages.add(op_suffix_voltages)
|
||||
player_ops.append(
|
||||
opcodes_6502.Literal(
|
||||
"tick_%02x: ; voltages %s" % (
|
||||
page_3_offset, op_suffix_voltages), indent=0))
|
||||
op_name = "TICK_%02x" % page_3_offset
|
||||
audio_player_ops[op_name] = player_op.PlayerOp(
|
||||
name=op_name,
|
||||
byte=page_3_offset,
|
||||
voltages=numpy.array(op_suffix_voltages))
|
||||
player_ops.append(op)
|
||||
page_3_offset += op.bytes
|
||||
|
||||
for op in player_ops:
|
||||
f.write("%s\n" % str(op))
|
||||
f.write("\n")
|
||||
|
||||
# stage 1 EOF trampoline operations
|
||||
duty_cycle_first = sorted(list(set(dc[0] for dc in EOF_DUTY_CYCLES)))
|
||||
stage_1_ops: Dict[str, player_op.PlayerOp] = {}
|
||||
for eof_stage1_cycles in duty_cycle_first:
|
||||
eof_stage1_ops = EOF_TRAMPOLINE_STAGE1[eof_stage1_cycles]
|
||||
if not eof_stage1_ops:
|
||||
continue
|
||||
|
||||
for op in eof_stage1_ops:
|
||||
f.write("%s\n" % str(op))
|
||||
f.write("\n")
|
||||
|
||||
op_name = "END_OF_FRAME_%d_STAGE1" % eof_stage1_cycles
|
||||
stage_1_ops[op_name] = player_op.PlayerOp(
|
||||
name=op_name,
|
||||
byte=page_3_offset,
|
||||
voltages=numpy.array(opcodes_6502.voltages(eof_stage1_ops)))
|
||||
page_3_offset += opcodes_6502.total_bytes(eof_stage1_ops)
|
||||
|
||||
# Write special-case (10,10) duty cycle EOF stage 1 operation
|
||||
for op in EOF_STAGE1_10_10_OPS:
|
||||
f.write("%s\n" % str(op))
|
||||
f.write("\n")
|
||||
|
||||
op_name = "END_OF_FRAME_10_10_STAGE1"
|
||||
stage_1_ops[op_name] = player_op.PlayerOp(
|
||||
name=op_name,
|
||||
byte=page_3_offset,
|
||||
voltages=numpy.array(opcodes_6502.voltages(EOF_STAGE1_10_10_OPS))
|
||||
)
|
||||
page_3_offset += opcodes_6502.total_bytes(EOF_STAGE1_10_10_OPS)
|
||||
|
||||
# XXX reserve space for reset vector and EXIT
|
||||
assert page_3_offset < 256
|
||||
f.write("; %d bytes\n" % page_3_offset)
|
||||
|
||||
# Generate assembly code for stage 2 and 3 EOF operations
|
||||
with open(player_stage2_filename, "w+") as f:
|
||||
|
||||
# Stage 2 EOF operations
|
||||
stage_2_3_ops: Dict[str, player_op.PlayerOp] = {}
|
||||
|
||||
stage_2_ops_by_stage_1_op: Dict[str, List[str]] = {}
|
||||
for eof_stage1_cycles in duty_cycle_first:
|
||||
eof_stage2_ops = EOF_TRAMPOLINE_STAGE2[eof_stage1_cycles]
|
||||
if not eof_stage2_ops:
|
||||
continue
|
||||
|
||||
for op in eof_stage2_ops:
|
||||
f.write("%s\n" % str(op))
|
||||
f.write("\n")
|
||||
|
||||
eof_10_10_stage2_ops = list(opcodes_6502.interleave_opcodes(
|
||||
itertools.chain(
|
||||
[opcodes_6502.padding(3), opcodes_6502.STA_C030],
|
||||
itertools.cycle([opcodes_6502.padding(6),
|
||||
opcodes_6502.STA_C030])), EOF_STAGE2_10_10_BASE
|
||||
))
|
||||
for op in eof_10_10_stage2_ops:
|
||||
f.write("%s\n" % str(op))
|
||||
f.write("\n")
|
||||
op_name = "END_OF_FRAME_10_10_STAGE2"
|
||||
stage_2_3_ops[op_name] = player_op.PlayerOp(
|
||||
name=op_name,
|
||||
byte=0xff, # Dummy
|
||||
voltages=numpy.array(opcodes_6502.voltages(eof_10_10_stage2_ops))
|
||||
)
|
||||
stage_2_ops_by_stage_1_op.setdefault(
|
||||
"END_OF_FRAME_10_10_STAGE1", []).append(op_name)
|
||||
|
||||
# Stage 3 EOF operations
|
||||
for a, b in EOF_DUTY_CYCLES:
|
||||
# Make sure we finish the first iteration of duty cycle
|
||||
c1, t1 = STAGE1_CYCLES_AFTER_TICK[a]
|
||||
c2, t2 = STAGE2_CYCLES_AFTER_TICK[a]
|
||||
|
||||
if t1 == 2 and t2 == 0:
|
||||
# First duty cycle completed in stage 1
|
||||
# Counting down second duty cycle
|
||||
assert b >= (c2 + c1 + 4)
|
||||
header = [opcodes_6502.padding(b - c2 - c1 - 4)]
|
||||
# print("Padding A %d, %d --> %s" % (a, b, header))
|
||||
|
||||
elif t1 == 1 and t2 == 1:
|
||||
# First duty cycle completed in stage 2
|
||||
# Counting down second duty cycle
|
||||
assert b >= (c2 + 4)
|
||||
header = [opcodes_6502.padding(b - c2 - 4)]
|
||||
# print(t1, c1, t2, c2)
|
||||
# print("Padding B %d, %d --> %s" % (a, b, header))
|
||||
elif t1 == 1 and t2 == 0:
|
||||
# First duty cycle has not yet completed
|
||||
# Counting down first duty cycle
|
||||
assert a >= (c2 + c1 + 4)
|
||||
header = [
|
||||
opcodes_6502.padding(a - c1 - c2 - 4),
|
||||
opcodes_6502.STA_C030,
|
||||
opcodes_6502.padding(b - 4),
|
||||
]
|
||||
# print(t1, c1, t2, c2)
|
||||
# print("Padding C %d, %d --> %s" % (a, b, header))
|
||||
else:
|
||||
assert False
|
||||
|
||||
stage_3_tick_ops = itertools.chain(header, itertools.cycle(
|
||||
[opcodes_6502.STA_C030, opcodes_6502.padding(a - 4),
|
||||
opcodes_6502.STA_C030, opcodes_6502.padding(b - 4)]
|
||||
))
|
||||
stage_3_ops = [opcodes_6502.Literal("eof_stage_3_%d_%d:" % (a, b),
|
||||
indent=0)] + list(
|
||||
opcodes_6502.interleave_opcodes(stage_3_tick_ops,
|
||||
EOF_STAGE_3_BASE))
|
||||
validate_stage_3_ops(
|
||||
[EOF_TRAMPOLINE_STAGE1[a], EOF_TRAMPOLINE_STAGE2[a],
|
||||
stage_3_ops], a, b)
|
||||
for op in stage_3_ops:
|
||||
f.write("%s\n" % str(op))
|
||||
f.write("\n")
|
||||
|
||||
name = "END_OF_FRAME_%d_%d_STAGE2_3" % (a, b)
|
||||
_, offset = EOF_TRAMPOLINE_STAGE3_PAGE_OFFSETS[a, b]
|
||||
|
||||
stage_2_3_ops[name] = player_op.PlayerOp(
|
||||
name=name,
|
||||
byte=offset,
|
||||
voltages=numpy.array(opcodes_6502.join_voltages(
|
||||
[EOF_TRAMPOLINE_STAGE2[a], stage_3_ops]))
|
||||
)
|
||||
stage_2_ops_by_stage_1_op.setdefault(
|
||||
"END_OF_FRAME_%d_STAGE1" % a, []).append(name)
|
||||
|
||||
with open(player_stage3_table_filename, "w+") as f:
|
||||
# We bin pack each (a, b) duty cycle onto the same jump table page
|
||||
first_duty_cycles_by_page = {}
|
||||
for ab, po in EOF_TRAMPOLINE_STAGE3_PAGE_OFFSETS.items():
|
||||
first_duty_cycles_by_page.setdefault(po[0], []).append(
|
||||
(po[1], ab))
|
||||
|
||||
for page, data in first_duty_cycles_by_page.items():
|
||||
offsets = [None] * 128
|
||||
first_cycles = set()
|
||||
for offset, cycles in data:
|
||||
offsets[offset // 2] = cycles
|
||||
first_cycles.add(cycles[0])
|
||||
for first_cycle in sorted(list(first_cycles)):
|
||||
f.write("eof_trampoline_%d_stage3_page:\n" % first_cycle)
|
||||
|
||||
for offset, cycles in enumerate(offsets):
|
||||
if cycles is None:
|
||||
f.write(" .word $FFFF\n")
|
||||
else:
|
||||
f.write(" .addr eof_stage_3_%d_%d\n" % cycles)
|
||||
f.write("\n")
|
||||
|
||||
# Generated python code for player operations
|
||||
with open(opcode_filename, "w") as f:
|
||||
f.write("import numpy\nimport player_op\n\n\nclass PlayerOps:\n")
|
||||
|
||||
for name, op in audio_player_ops.items():
|
||||
f.write(" %s = player_op.%s\n" % (name, op.define_self()))
|
||||
# XXX EXIT operation
|
||||
# f.write(" EXIT = player_op.PlayerOp(0x%02x)\n" % num_bytes)
|
||||
f.write("\n")
|
||||
|
||||
for name, op in stage_1_ops.items():
|
||||
f.write(" %s = player_op.%s\n" % (name, op.define_self()))
|
||||
f.write("\n")
|
||||
|
||||
for name, op in stage_2_3_ops.items():
|
||||
f.write(" %s = player_op.%s\n" % (name, op.define_self()))
|
||||
f.write("\n")
|
||||
|
||||
f.write("\nAUDIO_OPS = (\n")
|
||||
for n in audio_player_ops:
|
||||
f.write(" PlayerOps.%s,\n" % n)
|
||||
f.write(")\n")
|
||||
|
||||
f.write("\nEOF_STAGE_1_OPS = (\n")
|
||||
for n in stage_1_ops:
|
||||
f.write(" PlayerOps.%s,\n" % n)
|
||||
f.write(")\n")
|
||||
|
||||
f.write("\nEOF_STAGE_2_3_OPS = {\n")
|
||||
for stage1_name, stage_2_3_names in stage_2_ops_by_stage_1_op.items():
|
||||
f.write(" PlayerOps.%s: [%s],\n" % (
|
||||
stage1_name, ", ".join("PlayerOps.%s" % n for n in sorted(
|
||||
stage_2_3_names))))
|
||||
f.write("}\n")
|
||||
|
||||
f.write("\n")
|
||||
|
||||
|
||||
def main():
|
||||
generate_player(
|
||||
opcode_filename="opcodes_generated.py",
|
||||
player_stage1_filename="player/player_generated.s",
|
||||
player_stage2_filename="player/player_stage2_3_generated.s",
|
||||
player_stage3_table_filename="player/player_stage3_table_generated.s"
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
71
lookahead.pyx
Normal file
71
lookahead.pyx
Normal file
|
@ -0,0 +1,71 @@
|
|||
# cython: infer_types=True
|
||||
# cython: profile=False
|
||||
# cython: boundscheck=False
|
||||
# cython: wraparound=False
|
||||
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
def evolve_return_best(object speaker, float position1, float position2, float voltage1, float voltage2, float[:, ::1] voltages, float[::1] data):
|
||||
cdef double c1 = speaker.c1
|
||||
cdef double c2 = speaker.c2
|
||||
cdef double b1 = speaker.b1
|
||||
cdef double b2 = speaker.b2
|
||||
cdef double scale = speaker.scale
|
||||
|
||||
cdef int i, j
|
||||
cdef double y, y1, y2
|
||||
cdef float x1, x2
|
||||
|
||||
cdef int lowest_idx
|
||||
cdef double lowest_err = 1e9
|
||||
cdef double error
|
||||
for i in range(voltages.shape[0]):
|
||||
x1 = voltage1
|
||||
x2 = voltage2
|
||||
y1 = position1
|
||||
y2 = position2
|
||||
error = 0
|
||||
for j in range(voltages.shape[1]):
|
||||
y = c1 * y1 - c2 * y2 + b1 * x1 + b2 * x2
|
||||
error += (y * scale - data[j]) ** 2
|
||||
if error > lowest_err:
|
||||
break
|
||||
x2 = x1
|
||||
x1 = voltages[i, j] # XXX does this really always lag?
|
||||
y2 = y1
|
||||
y1 = y
|
||||
if error < lowest_err:
|
||||
lowest_err = error
|
||||
lowest_idx = i
|
||||
|
||||
return lowest_idx
|
||||
|
||||
|
||||
def evolve(object speaker, float position1, float position2, float voltage1, float voltage2, float[:, ::1] voltages):
|
||||
cdef double[:,::1] output = np.empty_like(voltages, dtype=np.float64)
|
||||
|
||||
cdef double c1 = speaker.c1
|
||||
cdef double c2 = speaker.c2
|
||||
cdef double b1 = speaker.b1
|
||||
cdef double b2 = speaker.b2
|
||||
|
||||
cdef int i, j
|
||||
cdef double y, y1, y2
|
||||
cdef float x1, x2
|
||||
|
||||
for i in range(voltages.shape[0]):
|
||||
x1 = voltage1
|
||||
x2 = voltage2
|
||||
y1 = position1
|
||||
y2 = position2
|
||||
for j in range(voltages.shape[1]):
|
||||
y = c1 * y1 - c2 * y2 + b1 * x1 + b2 * x2
|
||||
output[i, j] = y
|
||||
x2 = x1
|
||||
x1 = voltages[i, j] # XXX does this really always lag?
|
||||
y2 = y1
|
||||
y1 = y
|
||||
|
||||
return output
|
149
opcodes.py
149
opcodes.py
|
@ -1,139 +1,122 @@
|
|||
import enum
|
||||
import functools
|
||||
from typing import List, Tuple
|
||||
|
||||
import numpy
|
||||
from typing import Dict, List, Tuple, Iterable
|
||||
|
||||
import opcodes_generated
|
||||
import player_op
|
||||
|
||||
|
||||
# TODO: support 6502 cycle counts as well
|
||||
|
||||
class Opcode(enum.Enum):
|
||||
"""Audio player opcodes representing atomic units of audio playback work."""
|
||||
TICK_17 = 0x00
|
||||
TICK_15 = 0x01
|
||||
TICK_13 = 0x02
|
||||
TICK_14 = 0x0a
|
||||
TICK_12 = 0x0b
|
||||
TICK_10 = 0x0c
|
||||
NOTICK_6 = 0x0f
|
||||
|
||||
EXIT = 0x12
|
||||
SLOWPATH = 0x22
|
||||
# How many bytes to use per frame in the audio stream. At the end of each
|
||||
# frame we need to switch to special end-of-frame operations to cause the
|
||||
# Apple II to manage the TCP socket buffers (ACK data received so far, and
|
||||
# check we have at least another frame of data available)
|
||||
#
|
||||
# With an 8KB socket buffer this seems to be about the maximum we can get away
|
||||
# with - it has to be page aligned, and 4KB causes stuttering even from a
|
||||
# local playback source.
|
||||
#
|
||||
# TODO: share this with encode_audio.py
|
||||
FRAME_SIZE = 2048
|
||||
|
||||
|
||||
def make_tick_voltages(length) -> numpy.ndarray:
|
||||
"""Voltage sequence for a NOP; ...; STA $C030; JMP (WDATA)."""
|
||||
c = numpy.full(length, 1.0, dtype=numpy.float32)
|
||||
for i in range(length - 7, length): # TODO: 6502
|
||||
c[i] = -1.0
|
||||
return c
|
||||
def cycle_length(op: player_op.PlayerOp) -> int:
|
||||
"""Returns the cycle length of a player opcode."""
|
||||
return len(op.voltages)
|
||||
|
||||
|
||||
def make_notick_voltages(length) -> numpy.ndarray:
|
||||
"""Voltage sequence for a NOP; ...; JMP (WDATA)."""
|
||||
return numpy.full(length, 1.0, dtype=numpy.float32)
|
||||
|
||||
|
||||
def make_slowpath_voltages() -> numpy.ndarray:
|
||||
"""Voltage sequence for slowpath TCP processing."""
|
||||
length = 8 * 14 + 10 # TODO: 6502
|
||||
c = numpy.full(length, 1.0, dtype=numpy.float32)
|
||||
voltage_high = True
|
||||
for i in range(8):
|
||||
voltage_high = not voltage_high
|
||||
for j in range(3 + 14 * i, min(length, 3 + 14 * (i + 1))):
|
||||
c[j] = 1.0 if voltage_high else -1.0
|
||||
return c
|
||||
|
||||
|
||||
# Sequence of applied voltage inversions that result from executing each player
|
||||
# opcode, at each processor cycle. We assume the starting applied voltage is
|
||||
# 1.0.
|
||||
VOLTAGE_SCHEDULE = {
|
||||
Opcode.TICK_17: make_tick_voltages(17),
|
||||
Opcode.TICK_15: make_tick_voltages(15),
|
||||
Opcode.TICK_13: make_tick_voltages(13),
|
||||
Opcode.TICK_14: make_tick_voltages(14),
|
||||
Opcode.TICK_12: make_tick_voltages(12),
|
||||
Opcode.TICK_10: make_tick_voltages(10),
|
||||
Opcode.NOTICK_6: make_notick_voltages(6),
|
||||
Opcode.SLOWPATH: make_slowpath_voltages(),
|
||||
|
||||
} # type: Dict[Opcode, numpy.ndarray]
|
||||
|
||||
|
||||
def cycle_length(op: Opcode) -> int:
|
||||
"""Returns the 65C02 cycle length of a player opcode."""
|
||||
return len(VOLTAGE_SCHEDULE[op])
|
||||
|
||||
|
||||
@functools.lru_cache(None)
|
||||
def opcode_choices(frame_offset: int) -> List[Opcode]:
|
||||
def opcode_choices(
|
||||
frame_offset: int,
|
||||
eof_stage_1_op: player_op.PlayerOp = None) -> List[player_op.PlayerOp]:
|
||||
"""Returns sorted list of valid opcodes for given frame offset.
|
||||
|
||||
Sorted by decreasing cycle length, so that if two opcodes produce equally
|
||||
good results, we'll pick the one with the longest cycle count to reduce the
|
||||
stream bitrate.
|
||||
"""
|
||||
if frame_offset == 2047:
|
||||
return [Opcode.SLOWPATH]
|
||||
if frame_offset == FRAME_SIZE - 2:
|
||||
return opcodes_generated.EOF_STAGE_1_OPS
|
||||
if frame_offset == FRAME_SIZE - 1:
|
||||
return opcodes_generated.EOF_STAGE_2_3_OPS[eof_stage_1_op]
|
||||
|
||||
opcodes = set(VOLTAGE_SCHEDULE.keys()) - {Opcode.SLOWPATH}
|
||||
return sorted(list(opcodes), key=cycle_length, reverse=True)
|
||||
return sorted(
|
||||
list(opcodes_generated.AUDIO_OPS), key=cycle_length, reverse=True)
|
||||
|
||||
|
||||
@functools.lru_cache(None)
|
||||
def opcode_lookahead(
|
||||
frame_offset: int,
|
||||
lookahead_cycles: int) -> Tuple[Tuple[Opcode]]:
|
||||
lookahead_cycles: int,
|
||||
eof_stage_1_op: player_op.PlayerOp = None
|
||||
) -> Tuple[Tuple[player_op.PlayerOp]]:
|
||||
"""Recursively enumerates all valid opcode sequences."""
|
||||
|
||||
ch = opcode_choices(frame_offset)
|
||||
ch = opcode_choices(frame_offset, eof_stage_1_op)
|
||||
ops = []
|
||||
for op in ch:
|
||||
if cycle_length(op) >= lookahead_cycles:
|
||||
ops.append((op,))
|
||||
else:
|
||||
for res in opcode_lookahead((frame_offset + 1) % 2048,
|
||||
lookahead_cycles - cycle_length(op)):
|
||||
# XXX check this
|
||||
if frame_offset == FRAME_SIZE - 2 and eof_stage_1_op is None:
|
||||
temp_op = op
|
||||
else:
|
||||
temp_op = eof_stage_1_op
|
||||
|
||||
for res in opcode_lookahead(
|
||||
(frame_offset + 1) % FRAME_SIZE,
|
||||
lookahead_cycles - cycle_length(op), temp_op):
|
||||
ops.append((op,) + res)
|
||||
return tuple(ops) # TODO: fix return type
|
||||
|
||||
|
||||
@functools.lru_cache(None)
|
||||
def cycle_lookahead(
|
||||
opcodes: Tuple[Opcode],
|
||||
lookahead_cycles: int
|
||||
) -> Tuple[float]:
|
||||
opcodes: Tuple[player_op.PlayerOp],
|
||||
lookahead_cycles: int) -> Tuple[float]:
|
||||
"""Computes the applied voltage effects of a sequence of opcodes.
|
||||
|
||||
i.e. produces the sequence of applied voltage changes that will result
|
||||
from executing these opcodes, limited to the next lookahead_cycles.
|
||||
"""
|
||||
cycles = []
|
||||
last_voltage = 1.0
|
||||
for op in opcodes:
|
||||
cycles.extend(VOLTAGE_SCHEDULE[op])
|
||||
cycles.extend(last_voltage * op.voltages)
|
||||
last_voltage = cycles[-1]
|
||||
return tuple(cycles[:lookahead_cycles])
|
||||
|
||||
|
||||
@functools.lru_cache(None)
|
||||
def candidate_opcodes(
|
||||
frame_offset: int, lookahead_cycles: int
|
||||
) -> Tuple[List[Opcode], numpy.ndarray]:
|
||||
frame_offset: int, lookahead_cycles: int,
|
||||
eof_stage_1_op: player_op.PlayerOp
|
||||
) -> Tuple[Tuple[player_op.PlayerOp], numpy.ndarray, int]:
|
||||
"""Deduplicate a tuple of opcode sequences that are equivalent.
|
||||
|
||||
For each opcode sequence whose effect is the same when truncated to
|
||||
lookahead_cycles, retains the first such opcode sequence.
|
||||
"""
|
||||
opcodes = opcode_lookahead(frame_offset, lookahead_cycles)
|
||||
seen_cycles = set()
|
||||
opcodes = opcode_lookahead(frame_offset, lookahead_cycles, eof_stage_1_op)
|
||||
# Look ahead over the common cycle subsequence to make sure we see as far
|
||||
# as possible into the future
|
||||
cycles = []
|
||||
for ops in opcodes:
|
||||
op_len = sum(cycle_length(op) for op in ops)
|
||||
cycles.append(op_len)
|
||||
lookahead_cycles = min(cycles)
|
||||
seen_cycles = {}
|
||||
pruned_opcodes = []
|
||||
pruned_cycles = []
|
||||
for ops in opcodes:
|
||||
cycles = cycle_lookahead(ops, lookahead_cycles)
|
||||
if cycles in seen_cycles:
|
||||
continue
|
||||
seen_cycles.add(cycles)
|
||||
pruned_opcodes.append(ops)
|
||||
seen_cycles[cycles] = ops
|
||||
pruned_opcodes.append(ops[0])
|
||||
pruned_cycles.append(cycles)
|
||||
|
||||
return pruned_opcodes, numpy.array(pruned_cycles, dtype=numpy.float32)
|
||||
pruned_opcodes = tuple(pruned_opcodes)
|
||||
return (
|
||||
pruned_opcodes,
|
||||
numpy.array(pruned_cycles, dtype=numpy.float32),
|
||||
lookahead_cycles
|
||||
)
|
||||
|
|
124
opcodes_6502.py
Normal file
124
opcodes_6502.py
Normal file
|
@ -0,0 +1,124 @@
|
|||
from typing import Iterable, Tuple
|
||||
|
||||
import numpy
|
||||
|
||||
|
||||
class Opcode:
|
||||
"""6502 assembly language opcode with cycle length"""
|
||||
|
||||
def __init__(self, cycles, num_bytes, asm="", indent=4, toggle=False):
|
||||
self.cycles = cycles
|
||||
self.bytes = num_bytes
|
||||
self.asm = asm
|
||||
self.indent = indent
|
||||
# The opcode toggles speaker (only) on the last cycle
|
||||
self.toggle = toggle
|
||||
|
||||
def __repr__(self):
|
||||
asm = "[%s] " % self.asm if self.asm else ""
|
||||
return "%s<%d cycles>" % (asm, self.cycles)
|
||||
|
||||
def __str__(self):
|
||||
indent = " " * self.indent
|
||||
comment = ' ; %d cycles' % self.cycles if self.cycles else ""
|
||||
return indent + self.asm + comment
|
||||
|
||||
|
||||
class Literal(Opcode):
|
||||
def __init__(self, asm, indent=4):
|
||||
super(Literal, self).__init__(
|
||||
cycles=0, num_bytes=0, asm=asm, indent=indent)
|
||||
|
||||
def __repr__(self):
|
||||
return "<literal>"
|
||||
|
||||
|
||||
class PaddingOpcode(Opcode):
|
||||
"""Opcode variant that can be replaced by other interleaved opcodes."""
|
||||
pass
|
||||
|
||||
|
||||
STA_C030 = Opcode(4, 3, "STA $C030", toggle=True)
|
||||
# TODO: support 6502 cycle timings (5 cycles instead of 6)
|
||||
JMP_WDATA = Opcode(6, 3, "JMP (WDATA)")
|
||||
|
||||
|
||||
def padding(cycles):
|
||||
return PaddingOpcode(cycles, None, "; pad %d cycles" % cycles)
|
||||
|
||||
|
||||
def nops(cycles: int) -> Iterable[Opcode]:
|
||||
if cycles < 2:
|
||||
raise ValueError
|
||||
while cycles:
|
||||
if cycles == 3:
|
||||
yield Opcode(3, 2, "STA zpdummy")
|
||||
cycles -= 3
|
||||
continue
|
||||
yield Opcode(2, 1, "NOP")
|
||||
cycles -= 2
|
||||
|
||||
|
||||
def interleave_opcodes(
|
||||
base_opcodes: Iterable[Opcode],
|
||||
interleaved_opcodes: Iterable[Opcode]) -> Iterable[Opcode]:
|
||||
for op in base_opcodes:
|
||||
if isinstance(op, PaddingOpcode):
|
||||
padding_cycles = op.cycles
|
||||
|
||||
while padding_cycles > 0:
|
||||
if interleaved_opcodes:
|
||||
interleaved_op = interleaved_opcodes[0]
|
||||
if (padding_cycles - interleaved_op.cycles) >= 0 and (
|
||||
padding_cycles - interleaved_op.cycles) != 1:
|
||||
yield interleaved_op
|
||||
padding_cycles -= interleaved_op.cycles
|
||||
interleaved_opcodes = interleaved_opcodes[1::]
|
||||
if not interleaved_opcodes:
|
||||
return
|
||||
continue
|
||||
if padding_cycles == 3:
|
||||
yield PaddingOpcode(3, 2, "STA zpdummy")
|
||||
padding_cycles -= 3
|
||||
else:
|
||||
yield PaddingOpcode(2, 1, "NOP")
|
||||
padding_cycles -= 2
|
||||
assert padding_cycles == 0
|
||||
else:
|
||||
yield op
|
||||
if interleaved_opcodes:
|
||||
print(interleaved_opcodes)
|
||||
raise OverflowError
|
||||
|
||||
|
||||
def total_bytes(opcodes: Iterable[Opcode]) -> int:
|
||||
return sum(op.bytes for op in opcodes)
|
||||
|
||||
|
||||
def total_cycles(opcodes: Iterable[Opcode]) -> int:
|
||||
return sum(op.cycles for op in opcodes)
|
||||
|
||||
|
||||
def voltages(opcodes: Iterable[Opcode]) -> Tuple[float]:
|
||||
res = []
|
||||
speaker = 1.0
|
||||
for op in opcodes:
|
||||
if not op.cycles:
|
||||
continue
|
||||
res.extend([speaker] * (op.cycles - 1))
|
||||
if op.toggle:
|
||||
speaker *= -1
|
||||
res.append(speaker)
|
||||
return tuple(res)
|
||||
|
||||
|
||||
def join_voltages(op_seq: Iterable[Iterable[Opcode]]) -> numpy.ndarray:
|
||||
res = []
|
||||
last_voltage = 1.0
|
||||
for ops in op_seq:
|
||||
op_voltages = voltages(ops)
|
||||
res.extend(
|
||||
numpy.array(op_voltages, dtype=numpy.float32) * last_voltage)
|
||||
last_voltage = res[-1]
|
||||
|
||||
return numpy.array(res, dtype=numpy.float32)
|
299
opcodes_generated.py
Normal file
299
opcodes_generated.py
Normal file
|
@ -0,0 +1,299 @@
|
|||
import numpy
|
||||
import player_op
|
||||
|
||||
|
||||
class PlayerOps:
|
||||
TICK_00 = player_op.PlayerOp(name="TICK_00", byte=0x00, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
TICK_01 = player_op.PlayerOp(name="TICK_01", byte=0x01, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
TICK_02 = player_op.PlayerOp(name="TICK_02", byte=0x02, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
TICK_05 = player_op.PlayerOp(name="TICK_05", byte=0x05, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
TICK_08 = player_op.PlayerOp(name="TICK_08", byte=0x08, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
TICK_09 = player_op.PlayerOp(name="TICK_09", byte=0x09, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
TICK_0a = player_op.PlayerOp(name="TICK_0a", byte=0x0a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
|
||||
END_OF_FRAME_4_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_4_STAGE1", byte=0x10, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_6_STAGE1", byte=0x19, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_7_STAGE1", byte=0x23, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_8_STAGE1", byte=0x29, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_9_STAGE1", byte=0x34, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_10_STAGE1", byte=0x3a, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_11_STAGE1", byte=0x40, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_12_STAGE1", byte=0x46, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_13_STAGE1", byte=0x4c, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_14_STAGE1", byte=0x52, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_15_STAGE1", byte=0x58, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_16_STAGE1", byte=0x5e, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_17_STAGE1", byte=0x64, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_18_STAGE1", byte=0x6a, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_19_STAGE1", byte=0x70, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_20_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_20_STAGE1", byte=0x76, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_21_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_21_STAGE1", byte=0x7c, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_22_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_22_STAGE1", byte=0x82, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_10_STAGE1 = player_op.PlayerOp(name="END_OF_FRAME_10_10_STAGE1", byte=0x88, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
|
||||
END_OF_FRAME_10_10_STAGE2 = player_op.PlayerOp(name="END_OF_FRAME_10_10_STAGE2", byte=0xff, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_21_STAGE2_3", byte=0x00, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_23_STAGE2_3", byte=0x02, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_24_STAGE2_3", byte=0x04, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_25_STAGE2_3", byte=0x06, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_26_STAGE2_3", byte=0x08, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_27_STAGE2_3", byte=0x0a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_28_STAGE2_3", byte=0x0c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_29_STAGE2_3", byte=0x0e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_30_STAGE2_3", byte=0x10, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_31_STAGE2_3", byte=0x12, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_32_STAGE2_3", byte=0x14, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_33_STAGE2_3", byte=0x16, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_34_STAGE2_3", byte=0x18, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_35_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_35_STAGE2_3", byte=0x1a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_36_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_36_STAGE2_3", byte=0x1c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_37_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_37_STAGE2_3", byte=0x1e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_38_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_38_STAGE2_3", byte=0x20, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_39_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_39_STAGE2_3", byte=0x22, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_40_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_40_STAGE2_3", byte=0x24, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_4_41_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_4_41_STAGE2_3", byte=0x26, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_21_STAGE2_3", byte=0x92, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_23_STAGE2_3", byte=0x94, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_24_STAGE2_3", byte=0x96, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_25_STAGE2_3", byte=0x98, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_26_STAGE2_3", byte=0x9a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_27_STAGE2_3", byte=0x9c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_28_STAGE2_3", byte=0x9e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_29_STAGE2_3", byte=0xa0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_30_STAGE2_3", byte=0xa2, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_31_STAGE2_3", byte=0xa4, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_32_STAGE2_3", byte=0xa6, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_33_STAGE2_3", byte=0xa8, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_34_STAGE2_3", byte=0xaa, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_35_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_35_STAGE2_3", byte=0xac, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_37_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_37_STAGE2_3", byte=0xae, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_6_38_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_6_38_STAGE2_3", byte=0xb0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_18_STAGE2_3", byte=0x28, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_20_STAGE2_3", byte=0x2a, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_21_STAGE2_3", byte=0x2c, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_22_STAGE2_3", byte=0x2e, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_23_STAGE2_3", byte=0x30, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_24_STAGE2_3", byte=0x32, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_25_STAGE2_3", byte=0x34, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_26_STAGE2_3", byte=0x36, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_27_STAGE2_3", byte=0x38, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_29_STAGE2_3", byte=0x3a, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_30_STAGE2_3", byte=0x3c, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_31_STAGE2_3", byte=0x3e, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_32_STAGE2_3", byte=0x40, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_33_STAGE2_3", byte=0x42, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_34_STAGE2_3", byte=0x44, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_36_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_36_STAGE2_3", byte=0x46, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_37_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_37_STAGE2_3", byte=0x48, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_7_38_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_7_38_STAGE2_3", byte=0x4a, voltages=numpy.array([1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_21_STAGE2_3", byte=0x1c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_23_STAGE2_3", byte=0x1e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_25_STAGE2_3", byte=0x20, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_26_STAGE2_3", byte=0x22, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_27_STAGE2_3", byte=0x24, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_29_STAGE2_3", byte=0x26, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_30_STAGE2_3", byte=0x28, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_31_STAGE2_3", byte=0x2a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_33_STAGE2_3", byte=0x2c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_34_STAGE2_3", byte=0x2e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_35_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_35_STAGE2_3", byte=0x30, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_8_37_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_8_37_STAGE2_3", byte=0x32, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_18_STAGE2_3", byte=0xb2, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_20_STAGE2_3", byte=0xb4, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_21_STAGE2_3", byte=0xb6, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_22_STAGE2_3", byte=0xb8, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_23_STAGE2_3", byte=0xba, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_24_STAGE2_3", byte=0xbc, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_25_STAGE2_3", byte=0xbe, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_26_STAGE2_3", byte=0xc0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_28_STAGE2_3", byte=0xc2, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_29_STAGE2_3", byte=0xc4, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_30_STAGE2_3", byte=0xc6, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_31_STAGE2_3", byte=0xc8, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_32_STAGE2_3", byte=0xca, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_33_STAGE2_3", byte=0xcc, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_34_STAGE2_3", byte=0xce, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_9_35_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_9_35_STAGE2_3", byte=0xd0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_18_STAGE2_3", byte=0xd2, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_21_STAGE2_3", byte=0xd4, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_22_STAGE2_3", byte=0xd6, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_23_STAGE2_3", byte=0xd8, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_24_STAGE2_3", byte=0xda, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_25_STAGE2_3", byte=0xdc, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_26_STAGE2_3", byte=0xde, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_27_STAGE2_3", byte=0xe0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_28_STAGE2_3", byte=0xe2, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_29_STAGE2_3", byte=0xe4, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_31_STAGE2_3", byte=0xe6, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_32_STAGE2_3", byte=0xe8, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_33_STAGE2_3", byte=0xea, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_10_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_10_34_STAGE2_3", byte=0xec, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_14_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_14_STAGE2_3", byte=0x4c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_16_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_16_STAGE2_3", byte=0x4e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_17_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_17_STAGE2_3", byte=0x50, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_18_STAGE2_3", byte=0x52, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_19_STAGE2_3", byte=0x54, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_20_STAGE2_3", byte=0x56, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_21_STAGE2_3", byte=0x58, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_23_STAGE2_3", byte=0x5a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_24_STAGE2_3", byte=0x5c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_25_STAGE2_3", byte=0x5e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_26_STAGE2_3", byte=0x60, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_27_STAGE2_3", byte=0x62, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_28_STAGE2_3", byte=0x64, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_29_STAGE2_3", byte=0x66, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_30_STAGE2_3", byte=0x68, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_31_STAGE2_3", byte=0x6a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_32_STAGE2_3", byte=0x6c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_11_34_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_11_34_STAGE2_3", byte=0x6e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_18_STAGE2_3", byte=0x4c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_20_STAGE2_3", byte=0x4e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_21_STAGE2_3", byte=0x50, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_22_STAGE2_3", byte=0x52, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_23_STAGE2_3", byte=0x54, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_25_STAGE2_3", byte=0x56, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_26_STAGE2_3", byte=0x58, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_27_STAGE2_3", byte=0x5a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_29_STAGE2_3", byte=0x5c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_31_STAGE2_3", byte=0x5e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_12_33_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_12_33_STAGE2_3", byte=0x60, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_14_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_14_STAGE2_3", byte=0x70, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_16_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_16_STAGE2_3", byte=0x72, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_17_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_17_STAGE2_3", byte=0x74, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_18_STAGE2_3", byte=0x76, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_19_STAGE2_3", byte=0x78, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_20_STAGE2_3", byte=0x7a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_21_STAGE2_3", byte=0x7c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_22_STAGE2_3", byte=0x7e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_23_STAGE2_3", byte=0x80, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_24_STAGE2_3", byte=0x82, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_25_STAGE2_3", byte=0x84, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_27_STAGE2_3", byte=0x86, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_28_STAGE2_3", byte=0x88, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_29_STAGE2_3", byte=0x8a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_30_STAGE2_3", byte=0x8c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_31_STAGE2_3", byte=0x8e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_13_32_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_13_32_STAGE2_3", byte=0x90, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_16_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_16_STAGE2_3", byte=0x00, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_17_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_17_STAGE2_3", byte=0x02, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_18_STAGE2_3", byte=0x04, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_19_STAGE2_3", byte=0x06, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_20_STAGE2_3", byte=0x08, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_22_STAGE2_3", byte=0x0a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_23_STAGE2_3", byte=0x0c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_24_STAGE2_3", byte=0x0e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_25_STAGE2_3", byte=0x10, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_26_STAGE2_3", byte=0x12, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_27_STAGE2_3", byte=0x14, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_29_STAGE2_3", byte=0x16, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_30_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_30_STAGE2_3", byte=0x18, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_14_31_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_14_31_STAGE2_3", byte=0x1a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_16_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_16_STAGE2_3", byte=0x34, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_17_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_17_STAGE2_3", byte=0x36, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_18_STAGE2_3", byte=0x38, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_19_STAGE2_3", byte=0x3a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_20_STAGE2_3", byte=0x3c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_21_STAGE2_3", byte=0x3e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_22_STAGE2_3", byte=0x40, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_23_STAGE2_3", byte=0x42, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_24_STAGE2_3", byte=0x44, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_26_STAGE2_3", byte=0x46, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_28_STAGE2_3", byte=0x48, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_15_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_15_29_STAGE2_3", byte=0x4a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_17_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_17_STAGE2_3", byte=0x62, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_18_STAGE2_3", byte=0x64, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_19_STAGE2_3", byte=0x66, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_20_STAGE2_3", byte=0x68, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_21_STAGE2_3", byte=0x6a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_22_STAGE2_3", byte=0x6c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_23_STAGE2_3", byte=0x6e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_25_STAGE2_3", byte=0x70, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_26_STAGE2_3", byte=0x72, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_27_STAGE2_3", byte=0x74, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_16_29_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_16_29_STAGE2_3", byte=0x76, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_18_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_18_STAGE2_3", byte=0x78, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_19_STAGE2_3", byte=0x7a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_20_STAGE2_3", byte=0x7c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_21_STAGE2_3", byte=0x7e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_22_STAGE2_3", byte=0x80, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_23_STAGE2_3", byte=0x82, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_24_STAGE2_3", byte=0x84, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_25_STAGE2_3", byte=0x86, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_26_STAGE2_3", byte=0x88, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_27_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_27_STAGE2_3", byte=0x8a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_17_28_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_17_28_STAGE2_3", byte=0x8c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_19_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_19_STAGE2_3", byte=0xee, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_20_STAGE2_3", byte=0xf0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_21_STAGE2_3", byte=0xf2, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_22_STAGE2_3", byte=0xf4, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_23_STAGE2_3", byte=0xf6, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_25_STAGE2_3", byte=0xf8, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_18_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_18_26_STAGE2_3", byte=0xfa, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_20_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_20_STAGE2_3", byte=0x8e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_21_STAGE2_3", byte=0x90, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_22_STAGE2_3", byte=0x92, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_23_STAGE2_3", byte=0x94, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_24_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_24_STAGE2_3", byte=0x96, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_25_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_25_STAGE2_3", byte=0x98, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_19_26_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_19_26_STAGE2_3", byte=0x9a, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_20_21_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_20_21_STAGE2_3", byte=0x9c, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_20_22_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_20_22_STAGE2_3", byte=0x9e, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_20_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_20_23_STAGE2_3", byte=0xa0, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_21_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_21_23_STAGE2_3", byte=0xfc, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], dtype=numpy.float32))
|
||||
END_OF_FRAME_22_23_STAGE2_3 = player_op.PlayerOp(name="END_OF_FRAME_22_23_STAGE2_3", byte=0xfe, voltages=numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0], dtype=numpy.float32))
|
||||
|
||||
|
||||
AUDIO_OPS = (
|
||||
PlayerOps.TICK_00,
|
||||
PlayerOps.TICK_01,
|
||||
PlayerOps.TICK_02,
|
||||
PlayerOps.TICK_05,
|
||||
PlayerOps.TICK_08,
|
||||
PlayerOps.TICK_09,
|
||||
PlayerOps.TICK_0a,
|
||||
)
|
||||
|
||||
EOF_STAGE_1_OPS = (
|
||||
PlayerOps.END_OF_FRAME_4_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_6_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_7_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_8_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_9_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_10_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_11_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_12_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_13_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_14_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_15_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_16_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_17_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_18_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_19_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_20_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_21_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_22_STAGE1,
|
||||
PlayerOps.END_OF_FRAME_10_10_STAGE1,
|
||||
)
|
||||
|
||||
EOF_STAGE_2_3_OPS = {
|
||||
PlayerOps.END_OF_FRAME_10_10_STAGE1: [PlayerOps.END_OF_FRAME_10_10_STAGE2],
|
||||
PlayerOps.END_OF_FRAME_4_STAGE1: [PlayerOps.END_OF_FRAME_4_21_STAGE2_3, PlayerOps.END_OF_FRAME_4_23_STAGE2_3, PlayerOps.END_OF_FRAME_4_24_STAGE2_3, PlayerOps.END_OF_FRAME_4_25_STAGE2_3, PlayerOps.END_OF_FRAME_4_26_STAGE2_3, PlayerOps.END_OF_FRAME_4_27_STAGE2_3, PlayerOps.END_OF_FRAME_4_28_STAGE2_3, PlayerOps.END_OF_FRAME_4_29_STAGE2_3, PlayerOps.END_OF_FRAME_4_30_STAGE2_3, PlayerOps.END_OF_FRAME_4_31_STAGE2_3, PlayerOps.END_OF_FRAME_4_32_STAGE2_3, PlayerOps.END_OF_FRAME_4_33_STAGE2_3, PlayerOps.END_OF_FRAME_4_34_STAGE2_3, PlayerOps.END_OF_FRAME_4_35_STAGE2_3, PlayerOps.END_OF_FRAME_4_36_STAGE2_3, PlayerOps.END_OF_FRAME_4_37_STAGE2_3, PlayerOps.END_OF_FRAME_4_38_STAGE2_3, PlayerOps.END_OF_FRAME_4_39_STAGE2_3, PlayerOps.END_OF_FRAME_4_40_STAGE2_3, PlayerOps.END_OF_FRAME_4_41_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_6_STAGE1: [PlayerOps.END_OF_FRAME_6_21_STAGE2_3, PlayerOps.END_OF_FRAME_6_23_STAGE2_3, PlayerOps.END_OF_FRAME_6_24_STAGE2_3, PlayerOps.END_OF_FRAME_6_25_STAGE2_3, PlayerOps.END_OF_FRAME_6_26_STAGE2_3, PlayerOps.END_OF_FRAME_6_27_STAGE2_3, PlayerOps.END_OF_FRAME_6_28_STAGE2_3, PlayerOps.END_OF_FRAME_6_29_STAGE2_3, PlayerOps.END_OF_FRAME_6_30_STAGE2_3, PlayerOps.END_OF_FRAME_6_31_STAGE2_3, PlayerOps.END_OF_FRAME_6_32_STAGE2_3, PlayerOps.END_OF_FRAME_6_33_STAGE2_3, PlayerOps.END_OF_FRAME_6_34_STAGE2_3, PlayerOps.END_OF_FRAME_6_35_STAGE2_3, PlayerOps.END_OF_FRAME_6_37_STAGE2_3, PlayerOps.END_OF_FRAME_6_38_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_7_STAGE1: [PlayerOps.END_OF_FRAME_7_18_STAGE2_3, PlayerOps.END_OF_FRAME_7_20_STAGE2_3, PlayerOps.END_OF_FRAME_7_21_STAGE2_3, PlayerOps.END_OF_FRAME_7_22_STAGE2_3, PlayerOps.END_OF_FRAME_7_23_STAGE2_3, PlayerOps.END_OF_FRAME_7_24_STAGE2_3, PlayerOps.END_OF_FRAME_7_25_STAGE2_3, PlayerOps.END_OF_FRAME_7_26_STAGE2_3, PlayerOps.END_OF_FRAME_7_27_STAGE2_3, PlayerOps.END_OF_FRAME_7_29_STAGE2_3, PlayerOps.END_OF_FRAME_7_30_STAGE2_3, PlayerOps.END_OF_FRAME_7_31_STAGE2_3, PlayerOps.END_OF_FRAME_7_32_STAGE2_3, PlayerOps.END_OF_FRAME_7_33_STAGE2_3, PlayerOps.END_OF_FRAME_7_34_STAGE2_3, PlayerOps.END_OF_FRAME_7_36_STAGE2_3, PlayerOps.END_OF_FRAME_7_37_STAGE2_3, PlayerOps.END_OF_FRAME_7_38_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_8_STAGE1: [PlayerOps.END_OF_FRAME_8_21_STAGE2_3, PlayerOps.END_OF_FRAME_8_23_STAGE2_3, PlayerOps.END_OF_FRAME_8_25_STAGE2_3, PlayerOps.END_OF_FRAME_8_26_STAGE2_3, PlayerOps.END_OF_FRAME_8_27_STAGE2_3, PlayerOps.END_OF_FRAME_8_29_STAGE2_3, PlayerOps.END_OF_FRAME_8_30_STAGE2_3, PlayerOps.END_OF_FRAME_8_31_STAGE2_3, PlayerOps.END_OF_FRAME_8_33_STAGE2_3, PlayerOps.END_OF_FRAME_8_34_STAGE2_3, PlayerOps.END_OF_FRAME_8_35_STAGE2_3, PlayerOps.END_OF_FRAME_8_37_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_9_STAGE1: [PlayerOps.END_OF_FRAME_9_18_STAGE2_3, PlayerOps.END_OF_FRAME_9_20_STAGE2_3, PlayerOps.END_OF_FRAME_9_21_STAGE2_3, PlayerOps.END_OF_FRAME_9_22_STAGE2_3, PlayerOps.END_OF_FRAME_9_23_STAGE2_3, PlayerOps.END_OF_FRAME_9_24_STAGE2_3, PlayerOps.END_OF_FRAME_9_25_STAGE2_3, PlayerOps.END_OF_FRAME_9_26_STAGE2_3, PlayerOps.END_OF_FRAME_9_28_STAGE2_3, PlayerOps.END_OF_FRAME_9_29_STAGE2_3, PlayerOps.END_OF_FRAME_9_30_STAGE2_3, PlayerOps.END_OF_FRAME_9_31_STAGE2_3, PlayerOps.END_OF_FRAME_9_32_STAGE2_3, PlayerOps.END_OF_FRAME_9_33_STAGE2_3, PlayerOps.END_OF_FRAME_9_34_STAGE2_3, PlayerOps.END_OF_FRAME_9_35_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_10_STAGE1: [PlayerOps.END_OF_FRAME_10_18_STAGE2_3, PlayerOps.END_OF_FRAME_10_21_STAGE2_3, PlayerOps.END_OF_FRAME_10_22_STAGE2_3, PlayerOps.END_OF_FRAME_10_23_STAGE2_3, PlayerOps.END_OF_FRAME_10_24_STAGE2_3, PlayerOps.END_OF_FRAME_10_25_STAGE2_3, PlayerOps.END_OF_FRAME_10_26_STAGE2_3, PlayerOps.END_OF_FRAME_10_27_STAGE2_3, PlayerOps.END_OF_FRAME_10_28_STAGE2_3, PlayerOps.END_OF_FRAME_10_29_STAGE2_3, PlayerOps.END_OF_FRAME_10_31_STAGE2_3, PlayerOps.END_OF_FRAME_10_32_STAGE2_3, PlayerOps.END_OF_FRAME_10_33_STAGE2_3, PlayerOps.END_OF_FRAME_10_34_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_11_STAGE1: [PlayerOps.END_OF_FRAME_11_14_STAGE2_3, PlayerOps.END_OF_FRAME_11_16_STAGE2_3, PlayerOps.END_OF_FRAME_11_17_STAGE2_3, PlayerOps.END_OF_FRAME_11_18_STAGE2_3, PlayerOps.END_OF_FRAME_11_19_STAGE2_3, PlayerOps.END_OF_FRAME_11_20_STAGE2_3, PlayerOps.END_OF_FRAME_11_21_STAGE2_3, PlayerOps.END_OF_FRAME_11_23_STAGE2_3, PlayerOps.END_OF_FRAME_11_24_STAGE2_3, PlayerOps.END_OF_FRAME_11_25_STAGE2_3, PlayerOps.END_OF_FRAME_11_26_STAGE2_3, PlayerOps.END_OF_FRAME_11_27_STAGE2_3, PlayerOps.END_OF_FRAME_11_28_STAGE2_3, PlayerOps.END_OF_FRAME_11_29_STAGE2_3, PlayerOps.END_OF_FRAME_11_30_STAGE2_3, PlayerOps.END_OF_FRAME_11_31_STAGE2_3, PlayerOps.END_OF_FRAME_11_32_STAGE2_3, PlayerOps.END_OF_FRAME_11_34_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_12_STAGE1: [PlayerOps.END_OF_FRAME_12_18_STAGE2_3, PlayerOps.END_OF_FRAME_12_20_STAGE2_3, PlayerOps.END_OF_FRAME_12_21_STAGE2_3, PlayerOps.END_OF_FRAME_12_22_STAGE2_3, PlayerOps.END_OF_FRAME_12_23_STAGE2_3, PlayerOps.END_OF_FRAME_12_25_STAGE2_3, PlayerOps.END_OF_FRAME_12_26_STAGE2_3, PlayerOps.END_OF_FRAME_12_27_STAGE2_3, PlayerOps.END_OF_FRAME_12_29_STAGE2_3, PlayerOps.END_OF_FRAME_12_31_STAGE2_3, PlayerOps.END_OF_FRAME_12_33_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_13_STAGE1: [PlayerOps.END_OF_FRAME_13_14_STAGE2_3, PlayerOps.END_OF_FRAME_13_16_STAGE2_3, PlayerOps.END_OF_FRAME_13_17_STAGE2_3, PlayerOps.END_OF_FRAME_13_18_STAGE2_3, PlayerOps.END_OF_FRAME_13_19_STAGE2_3, PlayerOps.END_OF_FRAME_13_20_STAGE2_3, PlayerOps.END_OF_FRAME_13_21_STAGE2_3, PlayerOps.END_OF_FRAME_13_22_STAGE2_3, PlayerOps.END_OF_FRAME_13_23_STAGE2_3, PlayerOps.END_OF_FRAME_13_24_STAGE2_3, PlayerOps.END_OF_FRAME_13_25_STAGE2_3, PlayerOps.END_OF_FRAME_13_27_STAGE2_3, PlayerOps.END_OF_FRAME_13_28_STAGE2_3, PlayerOps.END_OF_FRAME_13_29_STAGE2_3, PlayerOps.END_OF_FRAME_13_30_STAGE2_3, PlayerOps.END_OF_FRAME_13_31_STAGE2_3, PlayerOps.END_OF_FRAME_13_32_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_14_STAGE1: [PlayerOps.END_OF_FRAME_14_16_STAGE2_3, PlayerOps.END_OF_FRAME_14_17_STAGE2_3, PlayerOps.END_OF_FRAME_14_18_STAGE2_3, PlayerOps.END_OF_FRAME_14_19_STAGE2_3, PlayerOps.END_OF_FRAME_14_20_STAGE2_3, PlayerOps.END_OF_FRAME_14_22_STAGE2_3, PlayerOps.END_OF_FRAME_14_23_STAGE2_3, PlayerOps.END_OF_FRAME_14_24_STAGE2_3, PlayerOps.END_OF_FRAME_14_25_STAGE2_3, PlayerOps.END_OF_FRAME_14_26_STAGE2_3, PlayerOps.END_OF_FRAME_14_27_STAGE2_3, PlayerOps.END_OF_FRAME_14_29_STAGE2_3, PlayerOps.END_OF_FRAME_14_30_STAGE2_3, PlayerOps.END_OF_FRAME_14_31_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_15_STAGE1: [PlayerOps.END_OF_FRAME_15_16_STAGE2_3, PlayerOps.END_OF_FRAME_15_17_STAGE2_3, PlayerOps.END_OF_FRAME_15_18_STAGE2_3, PlayerOps.END_OF_FRAME_15_19_STAGE2_3, PlayerOps.END_OF_FRAME_15_20_STAGE2_3, PlayerOps.END_OF_FRAME_15_21_STAGE2_3, PlayerOps.END_OF_FRAME_15_22_STAGE2_3, PlayerOps.END_OF_FRAME_15_23_STAGE2_3, PlayerOps.END_OF_FRAME_15_24_STAGE2_3, PlayerOps.END_OF_FRAME_15_26_STAGE2_3, PlayerOps.END_OF_FRAME_15_28_STAGE2_3, PlayerOps.END_OF_FRAME_15_29_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_16_STAGE1: [PlayerOps.END_OF_FRAME_16_17_STAGE2_3, PlayerOps.END_OF_FRAME_16_18_STAGE2_3, PlayerOps.END_OF_FRAME_16_19_STAGE2_3, PlayerOps.END_OF_FRAME_16_20_STAGE2_3, PlayerOps.END_OF_FRAME_16_21_STAGE2_3, PlayerOps.END_OF_FRAME_16_22_STAGE2_3, PlayerOps.END_OF_FRAME_16_23_STAGE2_3, PlayerOps.END_OF_FRAME_16_25_STAGE2_3, PlayerOps.END_OF_FRAME_16_26_STAGE2_3, PlayerOps.END_OF_FRAME_16_27_STAGE2_3, PlayerOps.END_OF_FRAME_16_29_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_17_STAGE1: [PlayerOps.END_OF_FRAME_17_18_STAGE2_3, PlayerOps.END_OF_FRAME_17_19_STAGE2_3, PlayerOps.END_OF_FRAME_17_20_STAGE2_3, PlayerOps.END_OF_FRAME_17_21_STAGE2_3, PlayerOps.END_OF_FRAME_17_22_STAGE2_3, PlayerOps.END_OF_FRAME_17_23_STAGE2_3, PlayerOps.END_OF_FRAME_17_24_STAGE2_3, PlayerOps.END_OF_FRAME_17_25_STAGE2_3, PlayerOps.END_OF_FRAME_17_26_STAGE2_3, PlayerOps.END_OF_FRAME_17_27_STAGE2_3, PlayerOps.END_OF_FRAME_17_28_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_18_STAGE1: [PlayerOps.END_OF_FRAME_18_19_STAGE2_3, PlayerOps.END_OF_FRAME_18_20_STAGE2_3, PlayerOps.END_OF_FRAME_18_21_STAGE2_3, PlayerOps.END_OF_FRAME_18_22_STAGE2_3, PlayerOps.END_OF_FRAME_18_23_STAGE2_3, PlayerOps.END_OF_FRAME_18_25_STAGE2_3, PlayerOps.END_OF_FRAME_18_26_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_19_STAGE1: [PlayerOps.END_OF_FRAME_19_20_STAGE2_3, PlayerOps.END_OF_FRAME_19_21_STAGE2_3, PlayerOps.END_OF_FRAME_19_22_STAGE2_3, PlayerOps.END_OF_FRAME_19_23_STAGE2_3, PlayerOps.END_OF_FRAME_19_24_STAGE2_3, PlayerOps.END_OF_FRAME_19_25_STAGE2_3, PlayerOps.END_OF_FRAME_19_26_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_20_STAGE1: [PlayerOps.END_OF_FRAME_20_21_STAGE2_3, PlayerOps.END_OF_FRAME_20_22_STAGE2_3, PlayerOps.END_OF_FRAME_20_23_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_21_STAGE1: [PlayerOps.END_OF_FRAME_21_23_STAGE2_3],
|
||||
PlayerOps.END_OF_FRAME_22_STAGE1: [PlayerOps.END_OF_FRAME_22_23_STAGE2_3],
|
||||
}
|
||||
|
|
@ -1,9 +1,13 @@
|
|||
#!/usr/bin/env python3
|
||||
#
|
||||
# Simple server to stream an .a2s file for playback from Apple II
|
||||
|
||||
import socketserver
|
||||
import sys
|
||||
|
||||
PORT = 1977
|
||||
|
||||
|
||||
def main(argv):
|
||||
serve_file = argv[1]
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ objects = $(patsubst %.s,%.o,$(src_files))
|
|||
all: $(DISKIMAGE)
|
||||
|
||||
%.o : %.s
|
||||
ca65 -t apple2 --cpu 6502 -o $@ $<
|
||||
ca65 -t apple2 --cpu 6502 -o $@ -l player.lst $<
|
||||
|
||||
%.system : %.o
|
||||
cl65 -t apple2 -C make/apple2-asm-system.cfg -u __EXEHDR__ --start-addr 0x2000 -o $@ $<
|
||||
|
|
|
@ -18,5 +18,6 @@ SEGMENTS {
|
|||
CODE: load = MAIN, type = rw;
|
||||
RODATA: load = MAIN, type = ro, optional = yes;
|
||||
DATA: load = MAIN, type = rw, optional = yes;
|
||||
DATA256: load = MAIN, type = rw, optional = yes, align = $100;
|
||||
BSS: load = BSS, type = bss, optional = yes, define = yes;
|
||||
}
|
||||
|
|
Binary file not shown.
225
player/player.s
225
player/player.s
|
@ -1,43 +1,38 @@
|
|||
;
|
||||
; player.s
|
||||
;
|
||||
; Created by Kris Kennaway on 27/07/2020.
|
||||
; Copyright © 2020 Kris Kennaway. All rights reserved.
|
||||
;
|
||||
; Delta modulation audio player for streaming audio over Ethernet.
|
||||
;
|
||||
; How this works is by modeling the Apple II speaker as an RC circuit. Delta modulation with an RC circuit is often
|
||||
; called "BTC", after https://www.romanblack.com/picsound.htm.
|
||||
; The encoder works by modeling the Apple II speaker as an RLC circuit and encoding audio using delta modulation.
|
||||
; The resulting audio stream causes the Apple II speaker to precisely trace out the desired waveform.
|
||||
;
|
||||
; When we tick the speaker it inverts the applied voltage across it, and the speaker responds by moving asymptotically
|
||||
; towards the new level. With some empirical tuning of the time constant of this RC circuit (which seems to be about
|
||||
; 500 us), we can precisely model how the speaker will respond to voltage changes, and use this to make the speaker
|
||||
; "trace out" our desired waveform. We can't do this precisely -- the speaker will zig-zag around the target waveform
|
||||
; because we can only move it in finite steps -- so there is some left-over quantization noise that manifests as
|
||||
; background static.
|
||||
; When we tick the speaker it inverts the applied voltage across it, and the speaker responds by oscillating with
|
||||
; an exponential decay towards the new level. By matching the speaker response parameters to actual hardware we can
|
||||
; precisely model how the speaker will respond to voltage changes, and use this to make the speaker "trace out" our
|
||||
; desired waveform. We can't do this precisely -- the speaker will zig-zag around the target waveform because we can
|
||||
; only move it in finite steps -- so there is some left-over quantization noise that manifests as background static.
|
||||
;
|
||||
; This player is capable of manipulating the speaker with 1-cycle precision, i.e. a 1MHz sampling rate, depending on
|
||||
; how the "player opcodes" are chained together by the ethernet bytestream. The catch is that once we have toggled
|
||||
; the speaker we can't toggle it again until at least 10 cycles have passed, but we can pick any interval >= 10 cycles
|
||||
; (except for 11 because of 6502 opcode timing limitations).
|
||||
;
|
||||
; Some other tricks used here:
|
||||
;
|
||||
; - The minimal 9-cycle speaker loop is: STA $C030; JMP (WDATA), where we use an undocumented property of the
|
||||
; - The minimal 10-cycle speaker loop is: STA $C030; JMP (WDATA), where we use an undocumented property of the
|
||||
; Uthernet II: I/O registers on the WDATA don't wire up all of the address lines, so they are also accessible at
|
||||
; other address offsets. In particular WDATA+1 is a duplicate copy of WMODE. In our case WMODE happens to be 0x3.
|
||||
; This lets us use WDATA as a jump table into page 3, where we place our player code. We then choose the network
|
||||
; byte stream to contain the low-order byte of the target address we want to jump to next.
|
||||
; - Since our 13-cycle period gives us 4 "spare" cycles over the minimal 9, that also lets us do a page-flipping trick
|
||||
; to visualize the audio bitstream while playing.
|
||||
; - As with my ][-Vision streaming video+audio player, we schedule a "slow path" dispatch to occur every 2KB in the
|
||||
; byte stream, and use this to manage the socket buffers (ACK the read 2KB and wait until at least 2KB more is
|
||||
; available, which is usually non-blocking). While doing this we need to maintain the 13 cycle cadence so the
|
||||
; available, which is usually non-blocking). While doing this we need to maintain a regular (a, b) cadence so the
|
||||
; speaker is in a known trajectory. We can compensate for this in the audio encoder.
|
||||
;
|
||||
; TODO: explain the two-stage dispatch for end-of-frame processing
|
||||
|
||||
.proc main
|
||||
.org $2000
|
||||
|
||||
init:
|
||||
JMP bootstrap
|
||||
|
||||
|
@ -47,16 +42,16 @@ FADDR: .byte 10,0,0,1 ; 10.0.0.1 FOREIGN IP
|
|||
FPORT: .byte $07,$b9 ; 1977 FOREIGN PORT
|
||||
MAC: .byte $00,$08,$DC,$01,$02,$03 ; W5100 MAC ADDRESS
|
||||
|
||||
; SLOT 1 I/O ADDRESSES FOR THE W5100
|
||||
; SLOT 3 I/O ADDRESSES FOR THE W5100
|
||||
; Change this to support the Uthernet II in another slot
|
||||
;
|
||||
; TODO: make slot I/O addresses customizable at runtime - would probably require somehow
|
||||
; compiling a list of all of the binary offsets at which we reference $C09x and patching
|
||||
; them in memory or on-disk.
|
||||
WMODE = $C094
|
||||
WADRH = $C095
|
||||
WADRL = $C096
|
||||
WDATA = $C097
|
||||
; compiling a list of all of the binary offsets at which we reference $C0bx and patching
|
||||
; them in memory or on-disk.
|
||||
WMODE = $C0b4
|
||||
WADRH = $C0b5
|
||||
WADRL = $C0b6
|
||||
WDATA = $C0b7
|
||||
|
||||
; W5100 LOCATIONS
|
||||
MACADDR = $0009 ; MAC ADDRESS
|
||||
|
@ -108,9 +103,9 @@ zpdummy = $ff
|
|||
; RESET AND CONFIGURE W5100
|
||||
bootstrap:
|
||||
; install reset handler
|
||||
LDA #<exit
|
||||
LDA #<real_exit
|
||||
STA RESET_VECTOR
|
||||
LDA #>exit
|
||||
LDA #>real_exit
|
||||
STA RESET_VECTOR+1
|
||||
EOR #$A5
|
||||
STA RESET_VECTOR+2 ; checksum to ensure warm-start reset
|
||||
|
@ -258,73 +253,44 @@ setup:
|
|||
; move player code into $3xx
|
||||
LDX #0
|
||||
@0:
|
||||
LDA begin_copy_page1,X
|
||||
LDA begin_copy_page3,X
|
||||
STA $300,X
|
||||
INX
|
||||
CPX #(end_copy_page1 - begin_copy_page1+1)
|
||||
CPX #(end_copy_page3 - begin_copy_page3+1)
|
||||
BNE @0
|
||||
|
||||
; clear screen
|
||||
jsr HOME
|
||||
|
||||
; to restore after checkrecv
|
||||
LDY #>RXBASE
|
||||
LDA #>S0RXRSR
|
||||
STA WADRH
|
||||
JMP checkrecv
|
||||
; We keep our own copy of the W5100 S0RXRD pointer because it's cheaper to maintain a local copy rather than
|
||||
; asking the W5100 for it in end-of-frame processing.
|
||||
lda #$00
|
||||
sta RXRD
|
||||
|
||||
; The actual player code, which will be copied to $3xx for execution
|
||||
;
|
||||
; opcode cycle counts are for 65c02, for 6502 they are 1 less because JMP (indirect) is 5 cycles instead of 6.
|
||||
; Wait for socket buffer to have at least 2KB of data in it
|
||||
LDX #>S0RXRSR
|
||||
STX WADRH
|
||||
LDX #<S0RXRSR
|
||||
|
||||
; TODO: evaluate whether it's worth adding longer NOTICK variants. They are less commonly needed than TICK because
|
||||
; we typically don't want to leave the speaker alone for a long period of time - it's unlikely that the target waveform
|
||||
; exactly tracks what the speaker will do without intervention.
|
||||
fill_socket:
|
||||
LDA #$07 ; Wait for at least 8 pages i.e. 2KB of data
|
||||
@0:
|
||||
STX WADRL ; #<S0RXRSR
|
||||
CMP WDATA ; Check high byte of received size
|
||||
BCS @0 ; Loop if not enough
|
||||
; There is data to read - we don't care exactly how much but it's at least 2K, which is enough to be sure we can
|
||||
; process the entirety of the next frame.
|
||||
;
|
||||
; Update W5100 address to point to start of socket buffer
|
||||
LDX #>RXBASE
|
||||
STX WADRH
|
||||
LDX #$00
|
||||
STX WADRL
|
||||
|
||||
begin_copy_page1:
|
||||
LDY #$31 ; establish required invariant for core audio loop
|
||||
JMP (WDATA) ; Start playing!
|
||||
|
||||
; combinations of the following tick_even and tick_odd opcodes are enough to recover all tick intervals >= 10 cycles,
|
||||
; except for 11:
|
||||
;
|
||||
; even tick intervals
|
||||
; 10 = TICK_10
|
||||
; 12 = TICK_12
|
||||
; 14 = TICK_14
|
||||
; 16 = NOTICK_6 + TICK_10
|
||||
; 18 = NOTICK_6 + TICK_12
|
||||
; 20 = NOTICK_6 + TICK_14
|
||||
; 22 = NOTICK_6 + NOTICK_6 + TICK_10
|
||||
; 24 = ...
|
||||
;
|
||||
; odd tick intervals
|
||||
; 11 = ?
|
||||
; 13 = TICK_13
|
||||
; 15 = TICK_15
|
||||
; 17 = TICK_17
|
||||
; 19 = NOTICK_6 + TICK_13
|
||||
; 21 = NOTICK_6 + TICK_15
|
||||
; 23 = NOTICK_6 + TICK_17
|
||||
; 25 = NOTICK_6 + NOTICK_6 + TICK_13
|
||||
; 27 = ...
|
||||
|
||||
; $300
|
||||
tick_odd: ; (NOTICK_6), (TICK_10), TICK_13, TICK_15, TICK_17
|
||||
NOP ; 2
|
||||
NOP ; 2
|
||||
STA zpdummy ; 3
|
||||
STA $C030 ; 4
|
||||
JMP (WDATA) ; 6
|
||||
|
||||
; $30a
|
||||
tick_even: ; NOTICK_6, TICK_10, TICK_12, TICK_14
|
||||
NOP ; 2
|
||||
NOP ; 2
|
||||
STA $C030 ; 4
|
||||
JMP (WDATA) ; 6
|
||||
|
||||
; $312
|
||||
; Quit to ProDOS
|
||||
exit:
|
||||
real_exit:
|
||||
INC RESET_VECTOR+2 ; Invalidate power-up byte
|
||||
JSR PRODOS ; Call the MLI ($BF00)
|
||||
.BYTE $65 ; CALL TYPE = QUIT
|
||||
|
@ -337,90 +303,25 @@ exit_parmtable:
|
|||
.BYTE 0 ; Byte reserved for future use
|
||||
.WORD 0000 ; Pointer reserved for future use
|
||||
|
||||
; Manage W5100 socket buffer and ACK TCP stream.
|
||||
;
|
||||
; In order to simplify the buffer management we expect this ACK opcode to consume the last 4 bytes in a 2K "TCP frame".
|
||||
; i.e. we can assume that we need to consume exactly 2K from the W5100 socket buffer.
|
||||
;
|
||||
; While during this we need to keep ticking the speaker at a regular cadence to maintain the same net position of the
|
||||
; speaker cone. We choose to tick every 14 cycles, which requires adding in minimal NOP padding.
|
||||
;
|
||||
; We end up ticking 8 times with 10 cycles left over, assuming we don't stall waiting for the socket buffer to refill.
|
||||
;
|
||||
; From the point of view of speaker voltages this slowpath is equivalent to the following opcode sequence:
|
||||
; TICK_6 (TICK_14 * 7) with 4 cycles left over, adding 4 to the effective n of the next TICK_n we jump to (as chosen by
|
||||
; the encoder).
|
||||
;
|
||||
; If we do stall waiting for data then there is no need to worry about maintaining an even cadence, because audio
|
||||
; will already be disrupted (since the encoder won't have predicted it, so will be tracking wrong). The speaker will
|
||||
; resynchronize within a few hundred microseconds though.
|
||||
slowpath: ;$322
|
||||
STA TICK ; 4
|
||||
|
||||
; Save the W5100 address pointer so we can come back here later
|
||||
; We know the low-order byte is 0 because Socket RX memory is page-aligned and so is 2K frame.
|
||||
; IMPORTANT - from now on until we restore this below, we can't trash the Y register!
|
||||
LDY WADRH ; 4
|
||||
|
||||
; Read Received Read pointer
|
||||
LDA #>S0RXRD ; 2
|
||||
STA WADRH ; 4
|
||||
STA TICK ; 4 [14]
|
||||
; TODO: store this in ZP instead? Cheaper to access (3 cycles instead of 4) but this tends to make it harder to align
|
||||
; the speaker accesses during EOF processing, since most opcodes we're using have an even cycle length
|
||||
RXRD:
|
||||
.byte 00
|
||||
|
||||
LDX #<S0RXRD ; 2
|
||||
STX WADRL ; 4
|
||||
LDA WDATA ; 4 Read high byte
|
||||
STA TICK ; 4 [14]
|
||||
; Stage 2 and 3 player code
|
||||
.include "player_stage2_3_generated.s"
|
||||
|
||||
; No need to read low byte since it's guaranteed to be 0 since we're at the end of a 2K frame.
|
||||
; Stage 1 player code, which will be copied to $3xx for execution
|
||||
begin_copy_page3:
|
||||
; generated audio playback code
|
||||
.include "player_generated.s"
|
||||
|
||||
; Update new Received Read pointer
|
||||
; We have received an additional 2KB
|
||||
CLC ; 2
|
||||
ADC #$08 ; 2
|
||||
; Quit to ProDOS
|
||||
exit:
|
||||
JMP real_exit
|
||||
end_copy_page3:
|
||||
|
||||
STX WADRL ; 4 Reset address pointer, X still has #<S0RXRD
|
||||
NOP ; 2
|
||||
STA TICK ; 4 [14]
|
||||
.segment "DATA256"
|
||||
.include "player_stage3_table_generated.s"
|
||||
|
||||
STA WDATA ; 4 Store new high byte
|
||||
; No need to store low byte since it's unchanged at 0
|
||||
|
||||
; Send the Receive command
|
||||
LDA #<S0CR ; 2
|
||||
STA WADRL ; 4
|
||||
STA TICK ; 4 [14]
|
||||
|
||||
LDA #SCRECV ; 2
|
||||
STA WDATA ; 4
|
||||
|
||||
checkrecv:
|
||||
LDA #<S0RXRSR ; 2 Socket 0 Received Size register
|
||||
LDX #$07 ; 2
|
||||
STA TICK ; 4 [14]
|
||||
|
||||
; we might loop an unknown number of times here waiting for data but the default should be to fall
|
||||
; straight through
|
||||
@0:
|
||||
STA WADRL ; 4
|
||||
CPX WDATA ; 4 High byte of received size
|
||||
NOP ; 2
|
||||
STA TICK ; 4 [14]
|
||||
BCS @0 ; 2 in common case when there is already sufficient data waiting.
|
||||
|
||||
; point W5100 back into the RX buffer where we left off
|
||||
; There is data to read - we don't care exactly how much because it's at least 2K
|
||||
;
|
||||
; Restore W5100 address pointer where we last found it.
|
||||
;
|
||||
; It turns out that the W5100 automatically wraps the address pointer at the end of the 8K RX/TX buffers
|
||||
; Since we're using an 8K socket, that means we don't have to do any work to manage the read pointer!
|
||||
STY WADRH ; 4
|
||||
LDX #$00 ; 2
|
||||
NOP ; 2
|
||||
STA TICK ; 4 [14]
|
||||
|
||||
STX WADRL ; 4
|
||||
JMP (WDATA) ; 6 [10/14]
|
||||
end_copy_page1:
|
||||
.endproc
|
||||
|
|
100
player/player_generated.s
Normal file
100
player/player_generated.s
Normal file
|
@ -0,0 +1,100 @@
|
|||
tick_00: ; voltages (1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
|
||||
NOP ; 2 cycles
|
||||
tick_01: ; voltages (1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
|
||||
NOP ; 2 cycles
|
||||
tick_02: ; voltages (1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
|
||||
STA $C030 ; 4 cycles
|
||||
tick_05: ; voltages (1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
|
||||
JMP (WDATA) ; 6 cycles
|
||||
|
||||
tick_08: ; voltages (1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
|
||||
NOP ; 2 cycles
|
||||
tick_09: ; voltages (1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
|
||||
NOP ; 2 cycles
|
||||
tick_0a: ; voltages (1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0)
|
||||
STA $BFFF,Y ; 5 cycles
|
||||
JMP (WDATA) ; 6 cycles
|
||||
|
||||
eof_trampoline_4:
|
||||
STA $C030 ; 4 cycles
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_4_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_6:
|
||||
STA $C030 ; 4 cycles
|
||||
NOP ; 2 cycles
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_6_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_7:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_7_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_8:
|
||||
STA $C030 ; 4 cycles
|
||||
NOP ; 2 cycles
|
||||
NOP ; 2 cycles
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_8_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_9:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_9_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_10:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_10_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_11:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_11_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_12:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_12_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_13:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_13_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_14:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_14_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_15:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_15_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_16:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_16_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_17:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_17_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_18:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_18_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_19:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_19_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_20:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_20_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_21:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_21_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_22:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_trampoline_22_stage2 ; 3 cycles
|
||||
|
||||
eof_trampoline_10_10:
|
||||
STA $C030 ; 4 cycles
|
||||
JMP eof_stage_2_10_10 ; 3 cycles
|
||||
|
||||
; 142 bytes
|
12591
player/player_stage2_3_generated.s
Normal file
12591
player/player_stage2_3_generated.s
Normal file
File diff suppressed because it is too large
Load Diff
276
player/player_stage3_table_generated.s
Normal file
276
player/player_stage3_table_generated.s
Normal file
|
@ -0,0 +1,276 @@
|
|||
eof_trampoline_4_stage3_page:
|
||||
eof_trampoline_6_stage3_page:
|
||||
eof_trampoline_7_stage3_page:
|
||||
eof_trampoline_9_stage3_page:
|
||||
eof_trampoline_10_stage3_page:
|
||||
eof_trampoline_11_stage3_page:
|
||||
eof_trampoline_13_stage3_page:
|
||||
eof_trampoline_18_stage3_page:
|
||||
eof_trampoline_21_stage3_page:
|
||||
eof_trampoline_22_stage3_page:
|
||||
.addr eof_stage_3_4_21
|
||||
.addr eof_stage_3_4_23
|
||||
.addr eof_stage_3_4_24
|
||||
.addr eof_stage_3_4_25
|
||||
.addr eof_stage_3_4_26
|
||||
.addr eof_stage_3_4_27
|
||||
.addr eof_stage_3_4_28
|
||||
.addr eof_stage_3_4_29
|
||||
.addr eof_stage_3_4_30
|
||||
.addr eof_stage_3_4_31
|
||||
.addr eof_stage_3_4_32
|
||||
.addr eof_stage_3_4_33
|
||||
.addr eof_stage_3_4_34
|
||||
.addr eof_stage_3_4_35
|
||||
.addr eof_stage_3_4_36
|
||||
.addr eof_stage_3_4_37
|
||||
.addr eof_stage_3_4_38
|
||||
.addr eof_stage_3_4_39
|
||||
.addr eof_stage_3_4_40
|
||||
.addr eof_stage_3_4_41
|
||||
.addr eof_stage_3_7_18
|
||||
.addr eof_stage_3_7_20
|
||||
.addr eof_stage_3_7_21
|
||||
.addr eof_stage_3_7_22
|
||||
.addr eof_stage_3_7_23
|
||||
.addr eof_stage_3_7_24
|
||||
.addr eof_stage_3_7_25
|
||||
.addr eof_stage_3_7_26
|
||||
.addr eof_stage_3_7_27
|
||||
.addr eof_stage_3_7_29
|
||||
.addr eof_stage_3_7_30
|
||||
.addr eof_stage_3_7_31
|
||||
.addr eof_stage_3_7_32
|
||||
.addr eof_stage_3_7_33
|
||||
.addr eof_stage_3_7_34
|
||||
.addr eof_stage_3_7_36
|
||||
.addr eof_stage_3_7_37
|
||||
.addr eof_stage_3_7_38
|
||||
.addr eof_stage_3_11_14
|
||||
.addr eof_stage_3_11_16
|
||||
.addr eof_stage_3_11_17
|
||||
.addr eof_stage_3_11_18
|
||||
.addr eof_stage_3_11_19
|
||||
.addr eof_stage_3_11_20
|
||||
.addr eof_stage_3_11_21
|
||||
.addr eof_stage_3_11_23
|
||||
.addr eof_stage_3_11_24
|
||||
.addr eof_stage_3_11_25
|
||||
.addr eof_stage_3_11_26
|
||||
.addr eof_stage_3_11_27
|
||||
.addr eof_stage_3_11_28
|
||||
.addr eof_stage_3_11_29
|
||||
.addr eof_stage_3_11_30
|
||||
.addr eof_stage_3_11_31
|
||||
.addr eof_stage_3_11_32
|
||||
.addr eof_stage_3_11_34
|
||||
.addr eof_stage_3_13_14
|
||||
.addr eof_stage_3_13_16
|
||||
.addr eof_stage_3_13_17
|
||||
.addr eof_stage_3_13_18
|
||||
.addr eof_stage_3_13_19
|
||||
.addr eof_stage_3_13_20
|
||||
.addr eof_stage_3_13_21
|
||||
.addr eof_stage_3_13_22
|
||||
.addr eof_stage_3_13_23
|
||||
.addr eof_stage_3_13_24
|
||||
.addr eof_stage_3_13_25
|
||||
.addr eof_stage_3_13_27
|
||||
.addr eof_stage_3_13_28
|
||||
.addr eof_stage_3_13_29
|
||||
.addr eof_stage_3_13_30
|
||||
.addr eof_stage_3_13_31
|
||||
.addr eof_stage_3_13_32
|
||||
.addr eof_stage_3_6_21
|
||||
.addr eof_stage_3_6_23
|
||||
.addr eof_stage_3_6_24
|
||||
.addr eof_stage_3_6_25
|
||||
.addr eof_stage_3_6_26
|
||||
.addr eof_stage_3_6_27
|
||||
.addr eof_stage_3_6_28
|
||||
.addr eof_stage_3_6_29
|
||||
.addr eof_stage_3_6_30
|
||||
.addr eof_stage_3_6_31
|
||||
.addr eof_stage_3_6_32
|
||||
.addr eof_stage_3_6_33
|
||||
.addr eof_stage_3_6_34
|
||||
.addr eof_stage_3_6_35
|
||||
.addr eof_stage_3_6_37
|
||||
.addr eof_stage_3_6_38
|
||||
.addr eof_stage_3_9_18
|
||||
.addr eof_stage_3_9_20
|
||||
.addr eof_stage_3_9_21
|
||||
.addr eof_stage_3_9_22
|
||||
.addr eof_stage_3_9_23
|
||||
.addr eof_stage_3_9_24
|
||||
.addr eof_stage_3_9_25
|
||||
.addr eof_stage_3_9_26
|
||||
.addr eof_stage_3_9_28
|
||||
.addr eof_stage_3_9_29
|
||||
.addr eof_stage_3_9_30
|
||||
.addr eof_stage_3_9_31
|
||||
.addr eof_stage_3_9_32
|
||||
.addr eof_stage_3_9_33
|
||||
.addr eof_stage_3_9_34
|
||||
.addr eof_stage_3_9_35
|
||||
.addr eof_stage_3_10_18
|
||||
.addr eof_stage_3_10_21
|
||||
.addr eof_stage_3_10_22
|
||||
.addr eof_stage_3_10_23
|
||||
.addr eof_stage_3_10_24
|
||||
.addr eof_stage_3_10_25
|
||||
.addr eof_stage_3_10_26
|
||||
.addr eof_stage_3_10_27
|
||||
.addr eof_stage_3_10_28
|
||||
.addr eof_stage_3_10_29
|
||||
.addr eof_stage_3_10_31
|
||||
.addr eof_stage_3_10_32
|
||||
.addr eof_stage_3_10_33
|
||||
.addr eof_stage_3_10_34
|
||||
.addr eof_stage_3_18_19
|
||||
.addr eof_stage_3_18_20
|
||||
.addr eof_stage_3_18_21
|
||||
.addr eof_stage_3_18_22
|
||||
.addr eof_stage_3_18_23
|
||||
.addr eof_stage_3_18_25
|
||||
.addr eof_stage_3_18_26
|
||||
.addr eof_stage_3_21_23
|
||||
.addr eof_stage_3_22_23
|
||||
|
||||
eof_trampoline_8_stage3_page:
|
||||
eof_trampoline_12_stage3_page:
|
||||
eof_trampoline_14_stage3_page:
|
||||
eof_trampoline_15_stage3_page:
|
||||
eof_trampoline_16_stage3_page:
|
||||
eof_trampoline_17_stage3_page:
|
||||
eof_trampoline_19_stage3_page:
|
||||
eof_trampoline_20_stage3_page:
|
||||
.addr eof_stage_3_14_16
|
||||
.addr eof_stage_3_14_17
|
||||
.addr eof_stage_3_14_18
|
||||
.addr eof_stage_3_14_19
|
||||
.addr eof_stage_3_14_20
|
||||
.addr eof_stage_3_14_22
|
||||
.addr eof_stage_3_14_23
|
||||
.addr eof_stage_3_14_24
|
||||
.addr eof_stage_3_14_25
|
||||
.addr eof_stage_3_14_26
|
||||
.addr eof_stage_3_14_27
|
||||
.addr eof_stage_3_14_29
|
||||
.addr eof_stage_3_14_30
|
||||
.addr eof_stage_3_14_31
|
||||
.addr eof_stage_3_8_21
|
||||
.addr eof_stage_3_8_23
|
||||
.addr eof_stage_3_8_25
|
||||
.addr eof_stage_3_8_26
|
||||
.addr eof_stage_3_8_27
|
||||
.addr eof_stage_3_8_29
|
||||
.addr eof_stage_3_8_30
|
||||
.addr eof_stage_3_8_31
|
||||
.addr eof_stage_3_8_33
|
||||
.addr eof_stage_3_8_34
|
||||
.addr eof_stage_3_8_35
|
||||
.addr eof_stage_3_8_37
|
||||
.addr eof_stage_3_15_16
|
||||
.addr eof_stage_3_15_17
|
||||
.addr eof_stage_3_15_18
|
||||
.addr eof_stage_3_15_19
|
||||
.addr eof_stage_3_15_20
|
||||
.addr eof_stage_3_15_21
|
||||
.addr eof_stage_3_15_22
|
||||
.addr eof_stage_3_15_23
|
||||
.addr eof_stage_3_15_24
|
||||
.addr eof_stage_3_15_26
|
||||
.addr eof_stage_3_15_28
|
||||
.addr eof_stage_3_15_29
|
||||
.addr eof_stage_3_12_18
|
||||
.addr eof_stage_3_12_20
|
||||
.addr eof_stage_3_12_21
|
||||
.addr eof_stage_3_12_22
|
||||
.addr eof_stage_3_12_23
|
||||
.addr eof_stage_3_12_25
|
||||
.addr eof_stage_3_12_26
|
||||
.addr eof_stage_3_12_27
|
||||
.addr eof_stage_3_12_29
|
||||
.addr eof_stage_3_12_31
|
||||
.addr eof_stage_3_12_33
|
||||
.addr eof_stage_3_16_17
|
||||
.addr eof_stage_3_16_18
|
||||
.addr eof_stage_3_16_19
|
||||
.addr eof_stage_3_16_20
|
||||
.addr eof_stage_3_16_21
|
||||
.addr eof_stage_3_16_22
|
||||
.addr eof_stage_3_16_23
|
||||
.addr eof_stage_3_16_25
|
||||
.addr eof_stage_3_16_26
|
||||
.addr eof_stage_3_16_27
|
||||
.addr eof_stage_3_16_29
|
||||
.addr eof_stage_3_17_18
|
||||
.addr eof_stage_3_17_19
|
||||
.addr eof_stage_3_17_20
|
||||
.addr eof_stage_3_17_21
|
||||
.addr eof_stage_3_17_22
|
||||
.addr eof_stage_3_17_23
|
||||
.addr eof_stage_3_17_24
|
||||
.addr eof_stage_3_17_25
|
||||
.addr eof_stage_3_17_26
|
||||
.addr eof_stage_3_17_27
|
||||
.addr eof_stage_3_17_28
|
||||
.addr eof_stage_3_19_20
|
||||
.addr eof_stage_3_19_21
|
||||
.addr eof_stage_3_19_22
|
||||
.addr eof_stage_3_19_23
|
||||
.addr eof_stage_3_19_24
|
||||
.addr eof_stage_3_19_25
|
||||
.addr eof_stage_3_19_26
|
||||
.addr eof_stage_3_20_21
|
||||
.addr eof_stage_3_20_22
|
||||
.addr eof_stage_3_20_23
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
.word $FFFF
|
||||
|
16
player_op.py
Normal file
16
player_op.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
import numpy
|
||||
|
||||
|
||||
class PlayerOp:
|
||||
def __init__(self, name: str, byte: int, voltages: numpy.ndarray):
|
||||
self.name = name
|
||||
self.byte = byte
|
||||
self.voltages = voltages
|
||||
|
||||
def __repr__(self):
|
||||
return self.name
|
||||
|
||||
def define_self(self):
|
||||
return ("PlayerOp(name=\"%s\", byte=0x%02x, voltages=numpy.array("
|
||||
"%s, dtype=numpy.float32))" % (self.name, self.byte,
|
||||
repr(list(self.voltages))))
|
42
preprocess_audio.py
Normal file
42
preprocess_audio.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
"""Converts an input file to 1.024MHz wav file used by encode_audio.py"""
|
||||
|
||||
import argparse
|
||||
import librosa
|
||||
import numpy
|
||||
import soundfile
|
||||
|
||||
|
||||
def preprocess(
|
||||
filename: str, target_sample_rate: int, normalize: float = 1.0,
|
||||
normalization_percentile: int = 100) -> numpy.ndarray:
|
||||
"""Upscale input audio to target sample rate and normalize signal."""
|
||||
|
||||
data, _ = librosa.load(filename, sr=target_sample_rate, mono=True)
|
||||
|
||||
max_value = numpy.percentile(data, normalization_percentile)
|
||||
data /= max_value
|
||||
data *= normalize
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--clock", choices=['pal', 'ntsc'],
|
||||
help="Whether target machine clock speed is PAL ("
|
||||
"1015657Hz) or NTSC (1020484)",
|
||||
required=True)
|
||||
parser.add_argument("input", type=str, help="input audio file to convert")
|
||||
parser.add_argument("output", type=str, help="output audio file")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Effective clock rate, including every-65 cycle "long cycle" that takes
|
||||
# 16/14 as long.
|
||||
sample_rate = 1015657 if args.clock == 'pal' else 1020484 # NTSC
|
||||
|
||||
soundfile.write(args.output, preprocess(args.input, sample_rate),
|
||||
sample_rate)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
5
requirements.txt
Normal file
5
requirements.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
SoundFile~=0.10.3.post1
|
||||
numpy~=1.21.6
|
||||
Cython~=0.29.28
|
||||
librosa~=0.9.1
|
||||
eta~=0.9.7
|
13
setup.py
Normal file
13
setup.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from setuptools import setup
|
||||
from Cython.Build import cythonize
|
||||
|
||||
import Cython.Compiler.Options
|
||||
Cython.Compiler.Options.annotate = True
|
||||
|
||||
setup(
|
||||
ext_modules=cythonize(
|
||||
["lookahead.pyx"],
|
||||
annotate=True,
|
||||
compiler_directives={'language_level': "3"}
|
||||
)
|
||||
)
|
140
sim_pwm.py
Normal file
140
sim_pwm.py
Normal file
|
@ -0,0 +1,140 @@
|
|||
import argparse
|
||||
import math
|
||||
import numpy
|
||||
import librosa
|
||||
import soundfile as sf
|
||||
|
||||
|
||||
def params(freq, damping, dt):
|
||||
w = freq * 2 * math.pi * dt
|
||||
d = damping * dt
|
||||
e = math.exp(d)
|
||||
c1 = 2 * e * math.cos(w)
|
||||
|
||||
c2 = e * e
|
||||
t0 = (1 - 2 * e * math.cos(w) + e * e) / (d * d + w * w)
|
||||
t = d * d + w * w - math.pi * math.pi
|
||||
t1 = (1 + 2 * e * math.cos(w) + e * e) / math.sqrt(t * t + 4 * d * d *
|
||||
math.pi * math.pi)
|
||||
b2 = (t1 - t0) / (t1 + t0)
|
||||
b1 = b2 * dt * dt * (t0 + t1) / 2
|
||||
|
||||
return c1, c2, b1, b2
|
||||
|
||||
|
||||
def filter_audio(
|
||||
audio: numpy.ndarray, sample_rate: float,
|
||||
sim_rate: float) -> numpy.ndarray:
|
||||
freq = 3875
|
||||
dt = 1 / sim_rate
|
||||
damping = -1210
|
||||
|
||||
c1, c2, b1, b2 = params(freq, damping, dt)
|
||||
|
||||
y1 = y2 = 0
|
||||
x1 = 0
|
||||
x2 = 0
|
||||
|
||||
x1 = 1.0
|
||||
scale = 1150 # TODO: analytic expression
|
||||
maxy = 0
|
||||
|
||||
cycles_per_sample = int(sim_rate / sample_rate)
|
||||
|
||||
audio_idx = 0
|
||||
sample = audio[0]
|
||||
duty_cycle = int((sample + 1) * cycles_per_sample / 2)
|
||||
next_toggle = duty_cycle
|
||||
cycles = 0
|
||||
y = 0
|
||||
bias = 1.0
|
||||
while audio_idx < len(audio) / 1:
|
||||
if audio_idx % 10000 == 0:
|
||||
print(audio_idx, len(audio), y / scale, x1, sample, duty_cycle,
|
||||
next_toggle)
|
||||
cycles += 1
|
||||
# x1 += bias / 4
|
||||
# if x1 > 1.0:
|
||||
# x1 = 1.0
|
||||
# if x1 < -1.0:
|
||||
# x1 = -1.0
|
||||
|
||||
y = (c1 * y1 - c2 * y2 + b1 * x1 + b2 * x2)
|
||||
x2 = x1
|
||||
if cycles >= next_toggle:
|
||||
bias *= -1.0
|
||||
x1 *= -1.0
|
||||
# x1 += bias / 4
|
||||
# if x1 > 1.0:
|
||||
# x1 = 1.0
|
||||
# if x1 < -1.0:
|
||||
# x1 = -1.0
|
||||
if bias == 1.0:
|
||||
audio_idx += 1
|
||||
if audio_idx < len(audio):
|
||||
sample = audio[audio_idx]
|
||||
duty_cycle = int((sample + 1) * cycles_per_sample / 2)
|
||||
else:
|
||||
duty_cycle = cycles_per_sample - duty_cycle
|
||||
next_toggle += duty_cycle
|
||||
|
||||
y2 = y1
|
||||
y1 = y
|
||||
if math.fabs(y) > maxy:
|
||||
maxy = math.fabs(y)
|
||||
yield y / scale
|
||||
print("scale = %f" % maxy)
|
||||
|
||||
|
||||
def preprocess(
|
||||
filename: str, target_sample_rate: int, normalize: float,
|
||||
normalization_percentile: int) -> numpy.ndarray:
|
||||
"""Upscale input audio to target sample rate and normalize signal."""
|
||||
|
||||
data, _ = librosa.load(filename, sr=target_sample_rate, mono=True)
|
||||
|
||||
max_value = numpy.percentile(data, normalization_percentile)
|
||||
data /= max_value
|
||||
data *= normalize
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--clock", choices=['pal', 'ntsc'],
|
||||
help="Whether target machine clock speed is PAL ("
|
||||
"1015657Hz) or NTSC (1020484)",
|
||||
required=True)
|
||||
parser.add_argument("--normalization", default=1.0, type=float,
|
||||
help="Overall multiplier to rescale input audio "
|
||||
"values.")
|
||||
parser.add_argument("--norm_percentile", default=100,
|
||||
help="Normalize to specified percentile value of input "
|
||||
"audio")
|
||||
parser.add_argument("input", type=str, help="input audio file to convert")
|
||||
parser.add_argument("output", type=str, help="output audio file")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Effective clock rate, including every-65 cycle "long cycle" that takes
|
||||
# 16/14 as long.
|
||||
sim_rate = 1015657 if args.clock == 'pal' else 1020484 # NTSC
|
||||
|
||||
input_audio = preprocess(args.input, sim_rate / 46, args.normalization,
|
||||
args.norm_percentile)
|
||||
|
||||
output_audio = numpy.array(
|
||||
list(filter_audio(input_audio, sim_rate / 46, sim_rate)),
|
||||
dtype=numpy.float32)
|
||||
|
||||
output_rate = 96000
|
||||
output = librosa.resample(output_audio, orig_sr=sim_rate,
|
||||
target_sr=output_rate)
|
||||
with sf.SoundFile(
|
||||
args.output, "w", output_rate, channels=1, format='WAV') \
|
||||
as f:
|
||||
f.write(output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
79
waveform.py
Normal file
79
waveform.py
Normal file
|
@ -0,0 +1,79 @@
|
|||
import math
|
||||
import librosa
|
||||
import numpy
|
||||
import soundfile as sf
|
||||
|
||||
|
||||
def params(freq, damping, dt):
|
||||
w = freq * 2 * math.pi * dt
|
||||
d = damping * dt
|
||||
e = math.exp(d)
|
||||
c1 = 2 * e * math.cos(w)
|
||||
|
||||
c2 = e * e
|
||||
t0 = (1 - 2 * e * math.cos(w) + e * e) / (d * d + w * w)
|
||||
t = d * d + w * w - math.pi * math.pi
|
||||
t1 = (1 + 2 * e * math.cos(w) + e * e) / math.sqrt(t * t + 4 * d * d *
|
||||
math.pi * math.pi)
|
||||
b2 = (t1 - t0) / (t1 + t0)
|
||||
b1 = b2 * dt * dt * (t0 + t1) / 2
|
||||
|
||||
return c1, c2, b1, b2
|
||||
|
||||
|
||||
def wave(count: int, sample_rate):
|
||||
freq = 3875
|
||||
dt = 1 / sample_rate
|
||||
damping = -1210 # -0.015167
|
||||
|
||||
c1, c2, b1, b2 = params(freq, damping, dt)
|
||||
|
||||
# freq2 = 525
|
||||
# damping2 = -130
|
||||
#
|
||||
# cc1, cc2, bb1, bb2 = params(freq2, damping2, dt)
|
||||
# mult2 = 1# 0.11
|
||||
|
||||
y1 = y2 = 0
|
||||
x1 = 0
|
||||
x2 = 0
|
||||
|
||||
# tm = math.atan(w/d)/w
|
||||
# scale = 500 * math.sqrt(d * d+ w * w) * math.exp(-d * tm) / (dt * 2000)
|
||||
|
||||
x1 = 1.0
|
||||
th = 23 # sample_rate // 10
|
||||
switch = th
|
||||
scale = 650 # TODO: analytic expression
|
||||
maxy = 0
|
||||
for i in range(count):
|
||||
# y = (c1 * y1 - c2 * y2 + b1 * x1 + b2 * x2) + mult2 * (
|
||||
# 1 - cc1 * y1 + cc2 * y2 - bb1 * x1 - bb2 * x2)
|
||||
y = (c1 * y1 - c2 * y2 + b1 * x1 + b2 * x2)
|
||||
# print(i, y / scale, x1)
|
||||
x2 = x1
|
||||
if i >= switch:
|
||||
x1 = -x1
|
||||
switch += th
|
||||
y2 = y1
|
||||
y1 = y
|
||||
if math.fabs(y) > maxy:
|
||||
maxy = math.fabs(y)
|
||||
yield y / scale
|
||||
print(maxy)
|
||||
|
||||
|
||||
def main():
|
||||
# print(list(wave(1020400)))
|
||||
sample_rate = 1015657
|
||||
output = numpy.array(list(wave(1015657, sample_rate)), dtype=numpy.float32)
|
||||
|
||||
output_rate = 96000 # int(sample_rate / 4)
|
||||
output = librosa.resample(output, orig_sr=sample_rate,
|
||||
target_sr=output_rate)
|
||||
with sf.SoundFile("out.wav", "w", samplerate=96000, channels=1) as f:
|
||||
f.write(output)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user