123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import binascii
- from bitarray import bitarray
- from greaseweazle.flux import Flux
- class MasterTrack:
- @property
- def bitrate(self):
- return len(self.bits) / self.time_per_rev
-
-
-
-
-
- def __init__(self, bits, time_per_rev, bit_ticks=None, splice=0, weak=[]):
- self.bits = bits
- self.time_per_rev = time_per_rev
- self.bit_ticks = bit_ticks
- self.splice = splice
- self.weak = weak
- def __str__(self):
- s = "\nMaster Track: splice @ %d\n" % self.splice
- s += (" %d bits, %.1f kbit/s"
- % (len(self.bits), self.bitrate))
- if self.bit_ticks:
- s += " (variable)"
- s += ("\n %.1f ms / rev (%.1f rpm)"
- % (self.time_per_rev * 1000, 60 / self.time_per_rev))
- if len(self.weak) > 0:
- s += "\n %d weak range" % len(self.weak)
- if len(self.weak) > 1: s += "s"
- s += ": " + ", ".join(str(n) for _,n in self.weak) + " bits"
-
- return s
- def flux_for_writeout(self):
-
- bits = self.bits.copy()
- bitlen = len(bits)
-
-
- bit_ticks = self.bit_ticks.copy() if self.bit_ticks else [1] * bitlen
- ticks_to_index = sum(bit_ticks)
-
- for s,n in self.weak:
- e = s + n
- assert 0 < s < e < bitlen
- pattern = bitarray(endian="big")
- if n < 400:
-
-
-
- pattern.frombytes(b"\x80\x00\x00\x00")
- bits[s:e] = (pattern * (n//32+1))[:n]
- else:
-
-
-
-
-
- pattern.frombytes(b"\x12\xA5")
- bits[s:e] = (pattern * (n//16+1))[:n]
- for i in range(0, n-10, 16):
- x, y = bit_ticks[s+i+10], bit_ticks[s+i+11]
- bit_ticks[s+i+10], bit_ticks[s+i+11] = x+y*0.5, y*0.5
-
-
-
- bits[s] = not bits[s-1]
-
- bits[e-1] = not(bits[e-2] or bits[e])
-
- index = -self.splice % bitlen
- if index != 0:
- bits = bits[index:] + bits[:index]
- bit_ticks = bit_ticks[index:] + bit_ticks[:index]
- splice_at_index = index < 4 or bitlen - index < 4
- if splice_at_index:
-
-
-
-
-
- pos = (self.splice - 4) % bitlen
-
- rep = bitlen // (10 * 32)
- bit_ticks = bit_ticks[:pos] + bit_ticks[pos-32:pos] * rep
- bits = bits[:pos] + bits[pos-32:pos] * rep
- else:
-
-
-
-
-
-
-
- bit_ticks += bit_ticks[:self.splice-4]
- bits += bits[:self.splice-4]
- pos = self.splice+4
- fill_pattern = bits[pos:pos+32]
- while pos >= 32:
- pos -= 32
- bits[pos:pos+32] = fill_pattern
-
- bit_ticks_i = iter(bit_ticks)
- flux_list = []
- flux_ticks = 0
- for bit in bits:
- flux_ticks += next(bit_ticks_i)
- if bit:
- flux_list.append(flux_ticks)
- flux_ticks = 0
- if flux_ticks:
- flux_list.append(flux_ticks)
-
- flux = Flux([ticks_to_index], flux_list,
- ticks_to_index / self.time_per_rev)
- flux.terminate_at_index = splice_at_index
- return flux
-
|