Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.
Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.
import glob
import os
source_binary_file = 'input_filename.bin'
working_directory = '/your_directory'
chunk_size = 130
with open(working_directory + '/' + source_binary_file, 'rb') as file:
chunk_number = 1
while True:
chunk = file.read(chunk_size)
if not chunk:
break
# Compute the checksum
checksum = 0
for byte in chunk[:-1]:
checksum += byte
if checksum > 255:
checksum = (checksum & 0xFF) + 1 # Overflow
if checksum == chunk[-1]:
print('Block nr:', chunk_number, ' Checksum:', checksum, 'OK')
else:
print('Block nr:', chunk_number, ' Checksum:', checksum, 'BAD')
# New binary value to add at the beginning
if chunk_number == 1:
# For first record add FUJI header
new_data = b'\x46\x55\x4a\x49\x00\x00\x00\x00'
# For first record IRG must be longer (706ms)
new_data = new_data + b'\x64\x61\x74\x61\x82\x00\xc2\x02'
else:
# For other records IRG=235ms
new_data = b'\x64\x61\x74\x61\x82\x00\xeb\x00'
# Connect the new value to the original data
combined_data = new_data + chunk
with open(f"{working_directory}/block_{chunk_number:03d}", 'wb') as chunk_file:
chunk_file.write(combined_data)
chunk_number += 1
max_chnk_number = chunk_number
print('number_of_blocks:', max_chnk_number-1)
# Connect all data blocks together
with open(working_directory + '/' + source_binary_file + '_result.CAS', 'wb') as outfile:
for chunk_number in range(1, max_chnk_number):
with open(f"{working_directory}/block_{chunk_number:03d}", 'rb') as infile:
outfile.write(infile.read())
print('Result written to file: ', working_directory + '/' + source_binary_file + '_result.CAS')
import numpy as np
from scipy.io import wavfile
def output_states_to_rs232(output_states):
# Zmienna do przechowywania zakodowanych bajtów
rs232_data = []
# Grupowanie bitów w bajty
i = 0
while 1:
# wyświetlenie licznika co 10000
if i % 10000 == 0:
print(i)
# Czekanie na bit startowy
if output_states[i] == 0:
byte = output_states[i+1:i+8] # Pobierz 8 bitów
rs232_data.append(byte) # Dodaj do listy RS-232
i=i+9 # pomiń odczytany bajt + bit stopowy
if output_states[i] != 1: # sprawdzenie bitu stopowego
print("Błąd bitu stopowego na pozycji:", i);
if i < len(output_states) - 1:
i = i + 1
else:
break
return rs232_data
def save_to_binary_file(rs232_data, filename):
with open(filename, 'wb') as f:
for byte in rs232_data:
# Konwertuj listę bitów na bajt
byte.reverse() # odwrócenie bitów bo najwyższy mieliśmy na końcu
byte_value = int(''.join(map(str, byte)), 2) # Konwersja na liczbę całkowitą
#print(byte_value)
f.write(byte_value.to_bytes(1, byteorder='little')) # Zapisz bajt do pliku
# Wczytaj plik WAV
filename = '/home/aaa/06-brucelee - coelsa injektor.wav' # Zmień na ścieżkę do swojego pliku WAV
sample_rate, data = wavfile.read(filename)
# Sprawdź, czy dane są stereo
if len(data.shape) == 2:
# Kanał prawy
time = np.linspace(0, len(data) / sample_rate, num=len(data))
# Znajdź przejścia przez zero dla kanału prawego
zero_crossings = np.where(np.diff(np.sign(data[:, 1])))[0]
# Zbieranie czasów przejść przez zero
zero_crossing_times = time[zero_crossings]
# Zbieranie wartości punktów digitalizacji poprzedzających przejścia przez zero
preceding_values = data[zero_crossings, 1] # Wartości kanału prawego
# Zmienna do przechowywania wartości bitów rozkodowanych przez Injektor
output_states = []
count_of_pilot_pulses = 0
semi_bite = False
output_states.append(1)
last_state = 1
# Analiza impulsów
for i in range(1, len(zero_crossing_times)):
# wyświetlenie licznikia co 10000
if i % 10000 == 0:
print(i)
# Obliczanie długości impulsu
duration = zero_crossing_times[i] - zero_crossing_times[i-1]
#print("Duration:", duration)
if duration > 0.000325:
output_states.append(1)
last_state = 1
#print("dodaję (1)")
else:
if duration > 0.000185:
count_of_pilot_pulses = 0;
# Sprawdzenie, czy impuls jest dodatni
if preceding_values[i] >= 0:
output_states.append(0) # Ustaw stan niski
last_state = 0
#print("dodaję (0)")
else:
output_states.append(1) # Ustaw stan wysoki
last_state = 1
#print("dodaję (1)")
else:
# Nie zmieniaj stanu
if semi_bite:
output_states.append(last_state)
#print("dodaję poprzedni stan", last_state)
semi_bite = False
else:
semi_bite = True
count_of_pilot_pulses = count_of_pilot_pulses + 1
if count_of_pilot_pulses > 20: # przynajmniej raz na 20 impulsów musi występować bit stopu (high). Jeśli nie to uznaję sygnał za pilota.
count_of_pilot_pulses = 0;
last_state = 1
# Rozkodowanie SIO (rs232)
rs232_encoded = output_states_to_rs232(output_states)
# Zapis dane do pliku binarnego
save_to_binary_file(rs232_encoded, '/home/aaa/06-brucelee - coelsa injektor.bin')
print("Dane zostały zapisane do pliku binarnego.")
else:
print("Plik audio nie jest stereo.")
from scipy.signal import butter, lfilter
high_cutoff_frequency = 7000
low_cutoff_frequency = 1000
...
order = 5 # Rząd filtru
b, a = butter(order, normal_cutoff, btype='low', analog=True)
...
PC=03FF: 20 10 04 JSR $0410
CD5C: A2 83 LDX #$83
CD5E: A9 CC LDA #$CC
CD60: 8E 22 02 STX $0222 ;VVBLKI
CD63: 8D 23 02 STA $0223 ;VVBLKI+1
CC80: 4C 5F E4 JMP $E45F ;SYSVBV