prehistory
N'ịbụ onye hụrụ ngwaike retro n'anya, azụrụ m ZX Spectrum+ n'aka onye na-ere ahịa na UK ozugbo. Gụnyere kọmputa ahụ n'onwe ya, enwetara m ọtụtụ cassettes ọdịyo nwere egwuregwu (na nkwakọ ngwaahịa mbụ nwere ntuziaka), yana mmemme edere na cassettes na-enweghị akara pụrụ iche. N'ụzọ dị ịtụnanya, data sitere na cassettes dị afọ 40 nwere ike ịgụ nke ọma na enwere m ike ibudata ihe fọrọ nke nta ka ọ bụrụ egwuregwu na mmemme niile na ha.

Agbanyeghị, na cassettes ụfọdụ ahụrụ m ndekọ nke kọmputa ZX Spectrum emeghị nke ọma. Ha na-ada ụda kpamkpam dị iche iche na, n'adịghị ka ndekọ sitere na kọmputa ahụ a kpọtụrụ aha, ha ejighị obere bootloader BASIC malite, nke na-adịkarị na ndekọ nke mmemme na egwuregwu niile.
Ruo oge ụfọdụ nke a na-ewute m - Achọrọ m n'ezie ịchọpụta ihe zoro ezo n'ime ha. Ọ bụrụ na ị nwere ike ịgụ mgbaàmà ọdịyo dị ka usoro nke bytes, ị nwere ike ịchọ mkpụrụedemede ma ọ bụ ihe ọ bụla na-egosi mmalite nke mgbaama ahụ. Ụdị retro-ihe ochie.
Ugbu a m na-aga n'ụzọ niile na-ele anya na labels nke cassettes n'onwe ha, m na-amụmụ ọnụ ọchị n'ihi na
azịza dị n'ihu m n'oge niile
Na labelụ nke kaseti aka ekpe bụ aha kọmputa TRS-80, na n'okpuru aha onye nrụpụta: "Radio Shack mere na USA"
(Ọ bụrụ na ịchọrọ idobe mgbagwoju anya ahụ ruo ọgwụgwụ, abanyela n'okpuru onye na-emebi ihe)
Ntụnyere akara ọdịyo
Nke mbụ, ka anyị were digitize ihe ndekọ ọdịyo. Ị nwere ike ige ntị ka ọ dị:
Dịkwa ka ọ dị na mbụ, ndekọ sitere na kọmputa ZX Spectrum na-ada:
N'okwu abụọ ahụ, na mmalite nke ndekọ a nwere ihe a na-akpọ ụda pilot - ụda nke otu ugboro (na ndekọ nke mbụ ọ dị mkpụmkpụ <1 nke abụọ, mana enwere ike ịmata ya). Ụda pilot na-egosi kọmpụta ka ọ kwado ịnata data. Dị ka a na-achị, kọmputa ọ bụla na-amata naanị ụda pilot "nke ya" site na ọdịdị nke mgbaàmà na ugboro ole ya.
Ọ dị mkpa ikwu ihe gbasara ọdịdị mgbaàmà n'onwe ya. Dịka ọmụmaatụ, na ZX Spectrum udi ya bụ akụkụ anọ:

Mgbe achọpụtara ụda pilot, ZX Spectrum na-egosiputa ogwe uhie na-acha anụnụ anụnụ n'akụkụ enyo ahụ iji gosi na achọpụtala mgbaàmà ahụ. Ụda pilot agwụ synchro pulse, nke na-egosi kọmputa ịmalite ịnata data. A na-eji oge dị mkpụmkpụ (tụnyere ụda pilot na data na-esote) (lee ọnụ ọgụgụ)
Mgbe enwetara pulse mmekọrịta ahụ, kọmpụta ahụ na-edekọ ịrị elu / ọdịda nke mgbaàmà ọ bụla, na-atụle oge ya. Ọ bụrụ na oge ahụ erughị oke njedebe, a na-ede bit 1 na ebe nchekwa, ma ọ bụghị 0. A na-anakọta ibe n'ime bytes ma na-emeghachi usoro ahụ ruo mgbe N bytes natara. A na-ewerekarị nọmba N site na nkụnye eji isi mee faịlụ ebudatara. Usoro nbudata bụ nke a:
- ụda pilot
- nkụnye eji isi mee (ogologo ogologo), nwere nha data ebudatara (N), aha faịlụ na ụdị
- ụda pilot
- data n'onwe ya
Iji jide n'aka na ebukọrọ data ahụ nke ọma, ZX Spectrum na-agụ ihe a na-akpọ parity byte (parity byte), nke a na-agbakọ mgbe ị na-echekwa faịlụ site na XOR na-eme ka ọbịtes niile nke data edere. Mgbe ị na-agụ faịlụ, kọmpụta ahụ na-agbakọ nha nha site na data enwetara, ma ọ bụrụ na nsonaazụ ya dị iche na nke echekwara, na-egosiputa ozi njehie "R Tape loading error". N'ikwu ya n'ụzọ ziri ezi, kọmpụta nwere ike ịnye ozi a na mbụ ma ọ bụrụ na, mgbe ọ na-agụ ya, ọ nweghị ike ịmata ụbụrụ ụbụrụ (agbaghara ma ọ bụ ogologo oge ya adabaghị na njedebe ụfọdụ)
Yabụ, ka anyị hụ ugbu a ka mgbama ama amaghi dị ka:

Nke a bụ ụda pilot. Ọdịdị nke mgbaàmà ahụ dị nnọọ iche, ma o doro anya na mgbaàmà ahụ nwere ugboro ugboro ugboro ugboro. N'oge nlele nke 44100 Hz, anya dị n'etiti "elu" bụ ihe dịka 48 sample (nke kwekọrọ na ugboro ~ 918 Hz Ka anyị cheta ọnụ ọgụgụ a).
Ka anyị leba anya na ibe data:

Ọ bụrụ na anyị atụlee anya n'etiti onye pulses, ọ na-atụgharị na anya n'etiti "ogologo" pulses ka ~ 48 samples, na n'etiti obere - ~ 24. Na-ele anya n'ihu ntakịrị, m ga-ekwu na n'ikpeazụ ọ tụgharịrị na "ntụgharị aka" na-eji ugboro 918 Hz na-aga n'ihu, site na mmalite ruo na njedebe nke faịlụ ahụ. Enwere ike iche na mgbe ị na-ebufe data, ọ bụrụ na a na-ezute pulse ọzọ n'etiti mkpụrụ akwụkwọ ntụaka, anyị na-ewere ya dị ka bit 1, ma ọ bụghị 0.
Kedu maka pulse syncing? Ka anyị leba anya na mmalite nke data:

Ụda pilot agwụ na data amalite ozugbo. N'oge na-adịbeghị anya, mgbe anyị nyochachara ọtụtụ ihe ndekọ ọdịyo dị iche iche, anyị nwere ike ịchọpụta na byte mbụ nke data na-abụkarị otu (10100101b, A5h). Kọmputa nwere ike ịmalite ịgụ data mgbe ọ natachara ya.
Ị nwekwara ike ịṅa ntị na ngbanwe nke ụbụrụ ntụaka nke mbụ ozugbo 1st ikpeazụ na byte mmekọrịta. Achọpụtara ya mgbe e mesịrị na usoro nke ịmepụta mmemme njirimara data, mgbe data dị na mmalite nke faịlụ enweghị ike ịgụ nke ọma.
Ugbu a, ka anyị nwaa ịkọwa algọridim nke ga-ahazi faịlụ ọdịyo na ibu data.
Na-ebu data
Nke mbụ, ka anyị leba anya n'echiche ole na ole iji mee ka algọridim dị mfe:
- Anyị ga-atụle naanị faịlụ na WAV usoro;
- Faịlụ ọdịyo ahụ ga-amaliterịrị site n'ụda pilot ma ọ nweghị ịgbachi nkịtị na mbido
- Faịlụ isi iyi ga-enwerịrị ọnụego nlele nke 44100 Hz. N'okwu a, a na-ekpebi ebe dị anya n'etiti mkpụrụ akwụkwọ ntụaka nke 48 ma ọ dịghị anyị mkpa ịgbakọ ya na mmemme;
- Ụdị ihe atụ nwere ike ịbụ ihe ọ bụla (8/16 ibe n'ibe / ebe a na-ese n'elu mmiri) - ebe ọ bụ na mgbe anyị na-agụ, anyị nwere ike ịtụgharị ya na nke achọrọ;
- Anyị na-eche na faịlụ isi mmalite na-edozi ya site na njupụta, nke kwesịrị ime ka nsonaazụ ya guzosie ike;
Algọridim ịgụ akwụkwọ ga-abụ nke a:
- Anyị na-agụ faịlụ ahụ na ebe nchekwa, n'otu oge ahụ na-atụgharị usoro ihe atụ na 8 bits;
- Kpebisie ike na ọnọdụ nke pulse mbụ na data ọdịyo. Iji mee nke a, ịkwesịrị ịgbakọ ọnụ ọgụgụ nke ihe nlele ahụ na njupụta kachasị elu. Maka ịdị mfe, anyị ga-agbakọ ya otu ugboro n'aka. Ka anyị chekwaa ya na prev_pos agbanwe;
- Tinye 48 n'ọnọdụ nke pulse ikpeazụ (pos:= prev_pos + 48)
- Ebe ọ bụ na ịbawanye ọnọdụ site na 48 anaghị ekwe nkwa na anyị ga-abanye n'ọnọdụ nke ụbụrụ na-esote (mmebi teepu, arụ ọrụ na-akwụghị ụgwọ nke teepu mbanye, wdg), anyị kwesịrị ịgbanwe ọnọdụ nke pulse pos. Iji mee nke a, were obere mpempe data (pos-8;pos + 8) wee chọta uru njupụta kachasị na ya. A ga-echekwa ọnọdụ kwekọrọ na nke kachasị na pos. Ebe a 8 = 48/6 bụ nnwale enwetara mgbe niile, nke na-ekwe nkwa na anyị ga-ekpebi oke kachasị na agaghị emetụta mkpali ndị ọzọ nwere ike ịdị nso. N'ọnọdụ dị oke njọ, mgbe anya n'etiti pulses dị obere ma ọ bụ karịa 48, ị nwere ike mejuputa nchọta mmanye maka pulse, ma n'ime oke nke isiokwu ahụ, agaghị m akọwa nke a na algọridim;
- Na nzọụkwụ gara aga, ọ ga-adịkwa mkpa ịlele na a chọtara pulse ntụaka ma ọlị. Ya bụ, ọ bụrụ na ịchọọ naanị nke kachasị, nke a anaghị ekwe nkwa na mkpali dị na mpaghara a. N'ime mmemme kachasị ọhụrụ m nke mmemme ọgụgụ, m na-enyocha ọdịiche dị n'etiti ụkpụrụ njupụta kachasị na nke kacha nta na akụkụ, ma ọ bụrụ na ọ gafere oke ụfọdụ, ana m agụta ọnụnọ nke mkpali. Ajụjụ bụkwa ihe a ga-eme ma ọ bụrụ na ahụghị usu ntụaka. Enwere nhọrọ 2: ma data ahụ akwụsịla ma gbachie nkịtị na-esote, ma ọ bụ nke a kwesịrị iwere dị ka njehie ọgụgụ. Agbanyeghị, anyị ga-ahapụ nke a iji mee ka algọridim dị mfe;
- Na nzọụkwụ ọzọ, anyị kwesịrị ikpebi ọnụnọ nke a data pulse (bit 0 ma ọ bụ 1), n'ihi na nke a anyị na-ewere n'etiti nke akụkụ (prev_pos; pos) middle_pos hà middle_pos : = (prev_pos + pos) / 2 na na ụfọdụ agbata obi middle_pos na ngalaba (midle_pos-8;midle_pos +8) ka anyị gbakọọ njupụta kacha na kacha nta. Ọ bụrụ na ndị dị iche n'etiti ha bụ ihe karịrị 10, anyị na-ede bit 1 n'ime N'ihi, ma ọ bụghị 0. 10 bụ mgbe nile nwetara experimentally;
- Chekwaa ọnọdụ dị ugbu a na prev_pos (prev_pos := pos)
- Tinyegharịa malite na nzọụkwụ 3 ruo mgbe anyị gụrụ faịlụ ahụ dum;
- A ga-echekwa n'usoro bit nke ga-esi na ya pụta dị ka setịpụ nke bytes. Ebe ọ bụ na anyị eburughị n'uche na byte mmekọrịta mgbe anyị na-agụ, ọnụọgụ nke bits nwere ike ọ gaghị abụ ọnụọgụ nke 8, na ihe nkwụsịtụ nke achọrọ na-amaghịkwa. Na mbido mbụ nke algọridim, amaghị m maka ịdị adị nke sync byte ma yabụ chekwaa faịlụ 8 dị iche iche nwere ọnụọgụ dị iche iche. Otu n'ime ha nwere data ziri ezi. Na algọridim ikpeazụ, m na-ewepụ ihe niile ruo A5h, nke na-enye m ohere ịnweta faịlụ mmepụta ziri ezi ozugbo
Algorithm na Ruby, maka ndị nwere mmasị
Ahọọrọ m Ruby ka ọ bụrụ asụsụ maka ide mmemme, n'ihi na... M na-eme mmemme na ya ọtụtụ oge. Nhọrọ ahụ abụghị ọrụ dị elu, ma ọrụ nke ime ka ịgụ akwụkwọ na-agụ ngwa ngwa dị ka o kwere mee abaghị uru.
# Используем gem 'wavefile'
require 'wavefile'
reader = WaveFile::Reader.new('input.wav')
samples = []
format = WaveFile::Format.new(:mono, :pcm_8, 44100)
# Читаем WAV файл, конвертируем в формат Mono, 8 bit
# Массив samples будет состоять из байт со значениями 0-255
reader.each_buffer(10000) do |buffer|
samples += buffer.convert(format).samples
end
# Позиция первого импульса (вместо 0)
prev_pos = 0
# Расстояние между импульсами
distance = 48
# Значение расстояния для окрестности поиска локального максимума
delta = (distance / 6).floor
# Биты будем сохранять в виде строки из "0" и "1"
bits = ""
loop do
# Рассчитываем позицию следующего импульса
pos = prev_pos + distance
# Выходим из цикла если данные закончились
break if pos + delta >= samples.size
# Корректируем позицию pos обнаружением максимума на отрезке [pos - delta;pos + delta]
(pos - delta..pos + delta).each { |p| pos = p if samples[p] > samples[pos] }
# Находим середину отрезка [prev_pos;pos]
middle_pos = ((prev_pos + pos) / 2).floor
# Берем окрестность в середине
sample = samples[middle_pos - delta..middle_pos + delta]
# Определяем бит как "1" если разница между максимальным и минимальным значением на отрезке превышает 10
bit = sample.max - sample.min > 10
bits += bit ? "1" : "0"
end
# Определяем синхро-байт и заменяем все предшествующие биты на 256 бит нулей (согласно спецификации формата)
bits.gsub! /^[01]*?10100101/, ("0" * 256) + "10100101"
# Сохраняем выходной файл, упаковывая биты в байты
File.write "output.cas", [bits].pack("B*")
N'ihi
N'ịgbalịrị ọtụtụ ụdị nke algọridim na nkwụsi ike, enwere m ihu ọma inweta ihe na-atọ ụtọ nke ukwuu:

Yabụ, na-ekpe ikpe site na ụdọ agwa, anyị nwere mmemme maka imepụta eserese. Agbanyeghị, enweghị isi okwu na ederede mmemme. Edebere mkpụrụokwu niile dị ka bytes (uru ọ bụla> 80h). Ugbu a, anyị kwesịrị ịchọpụta nke kọmputa sitere na 80s nwere ike ịchekwa mmemme na usoro a.
N'ezie, ọ dị nnọọ ka mmemme BASIC. Kọmputa ZX Spectrum na-echekwa mmemme n'ihe dịka otu usoro na ebe nchekwa ma chekwaa mmemme na teepu. Naanị ọ bụrụ na, enyochara m mkpụrụokwu megide . Agbanyeghị, nsonaazụ ya doro anya adịghị mma.
M enyochakwara isi okwu BASIC nke Atari na-ewu ewu, Commodore 64 na ọtụtụ kọmputa ndị ọzọ nke oge ahụ, bụ nke m nwere ike ịchọta akwụkwọ, ma na-enweghị ihe ịga nke ọma - ihe ọmụma m banyere ụdị nke kọmputa retro tụgharịrị na-adịghị obosara.
Ekem mma mbiere ndika , mgbe ahụ, anya m dakwasịrị aha onye nrụpụta Radio Shack na kọmputa TRS-80. Ndị a bụ aha ndị e dekọrọ n'akwụkwọ kaseeti ndị ahụ dị n'elu tebụl m! Amaghị m aha ndị a na mbụ, amaghịkwa m na kọmputa TRS-80, n'ihi ya, ọ dị m ka Radio Shack bụ onye na-emepụta cassette audio dị ka BASF, Sony ma ọ bụ TDK, na TRS-80 bụ oge egwu egwu. Gịnị mere?
Kọmputa Tandy/Radio Shack TRS-80
O yikarịrị ka ihe ndekọ ọdịyo a na-ajụ, bụ nke m nyere dị ka ihe atụ na mmalite nke isiokwu ahụ, mere na kọmputa dị ka nke a:

Ọ tụgharịrị na kọmputa a na ụdị ya (Model I / Model III / Model IV, wdg) bụ ndị a ma ama n'otu oge (n'ezie, ọ bụghị na Russia). Ọ bụ ihe kwesịrị ịrịba ama na processor ha ji mee ihe bụkwa Z80. Maka kọmpụta a ị nwere ike ịhụ na ịntanetị . Na 80s, e kesara ozi kọmputa na . N'oge a enwere ọtụtụ kọmputa maka ụdị dị iche iche.
M budata emulator na nke mbụ enwere m ike ịhụ ka kọmputa a si arụ ọrụ. N'ezie, kọmputa anaghị akwado mmepụta agba; Enwekwara ọtụtụ nhọrọ maka sistemụ arụmọrụ maka kọmpụta a yana nhọrọ maka imejuputa asusu BASIC (nke, n'adịghị ka ZX Spectrum, n'ụdị ụfọdụ emebeghị ka ọ bụrụ “flashed” n'ime ROM yana nhọrọ ọ bụla enwere ike ibunye na diski floppy, dị ka. OS n'onwe ya)
Achọkwara m iji gbanwee ihe ndekọ ọdịyo ka ọ bụrụ usoro CAS, nke ndị emulator na-akwado, mana n'ihi ihe ụfọdụ, ọ gaghị ekwe omume iji ha gụọ ihe ndekọ sitere na kaseti m.
N'ịchọpụtara usoro faịlụ CAS (nke tụgharịrị bụrụ naanị ntakịrị ntakịrị data sitere na teepu nke m nweburu n'aka, ma e wezụga maka nkụnye eji isi mee na ọnụnọ nke sync byte), emere m a mgbanwe ole na ole na mmemme m wee nwee ike iwepụta faịlụ CAS na-arụ ọrụ na-arụ ọrụ na emulator (TRS-80 Model III):

Emebere m ụdị ntụgharị kachasị ọhụrụ site na iji mkpebi akpaaka nke pulse mbụ na anya dị n'etiti ngwungwu GEM, koodu isi dị na .
nkwubi
Ụzọ ahụ anyị gara wee bụrụ njem na-adọrọ adọrọ n'ime oge gara aga, enwere m obi ụtọ na n'ikpeazụ m nwetara azịza ya. Tinyere ihe ndị ọzọ, m:
- Achọpụtara m usoro maka ịchekwa data na ZX Spectrum wee mụọ usoro ROM arụnyere n'ime ya maka ịchekwa / ịgụ data sitere na cassettes ọdịyo.
- Amatara m kọmputa TRS-80 na ụdị ya dị iche iche, mụọ sistemụ arụmọrụ, lelee mmemme nlele na ọbụna nwee ohere ịme nbibi na koodu igwe (mgbe niile, Z80 mnemonics maara m nke ọma)
- Edere akụrụngwa zuru oke maka ịtụgharị ndekọ ọdịyo ka ọ bụrụ usoro CAS, nke nwere ike ịgụ data nke ndị ọrụ “onye isi” na-amataghị.
isi: www.habr.com
