Quomodo recepi notitia in forma ignota ex magnetica tape

erectus

Cum amans ferramentorum retro, semel emi Saxo Spectrum+ ex venditore in UK. Inclusus cum ipso computatorio accepi aliquot reta informatica cum ludis (in originali packaging cum instructionibus), necnon programmata in cassettis sine notis specialibus conscripta. Mire, notitia ex reta XL annorum bene lectum erat, et omnes fere ludos et programmata ab eis capere potui.

Quomodo recepi notitia in forma ignota ex magnetica tape

Tamen in aliquibus retis inveni tabulas quae plane non factae sunt ab instrumento ZX Imaginis. Sonuerunt omnino diversae et, dissimiles tabulas e computatro memorato, non initium fecerunt cum brevi fasciculo fundamentali, quod in omnium programmatis et ludorum actis fieri solet.

Hoc me aliquandiu occupavit - quid in eis latebat invenire volui. Si signum auditionis ut series bytes legere potuisti, indolem vel aliquid quod signum originis indicat. Retro-archaeologiae quaedam.

Nunc omnem viam abieci et in ipsa reta pittacia vide, quia rideo

responsum rectum ante oculos meos omnes
In pittacio cassette sinistri nomen est TRS-80 computatorium, et sub nomine fabricae: "Facta per Radio canaba in USA"

(Si vis adulterium usque ad finem servare, noli sub praedo)

Comparatio significationis audio

Primum omnium tabulas audio. Audire potes quid sonat;


Et, ut solet, in tabulario soni computatorii Saxi spectri;


Utrisque in principio memoriae proditum est gubernator sono β€” sonus eiusdem frequentiae (in memoria prima brevissima est <1 secunda, sed distinguitur). Gubernator tonum computatorium signat ut data recipiat. Pro regula singuli computatorium suum solum "proprium" gubernatorem sonum agnoscit per modum signi eiusque frequentiam.

Necesse est aliquid dicere de ipsa figura signo. Verbi gratia, in ZX Imaginis figura rectangula est;

Quomodo recepi notitia in forma ignota ex magnetica tape

Cum gubernator deprehensus est tonus, Saxi Imaginis vectes in confinio ducto ad indicandum signum agnitum alternae rubrae et caeruleae ostendunt. Gubernator sono terminos synchro pulsus, quod significat computatrum incipere data accipiendi. Notatur breviore tempore (ad tonum gubernatori et notitia sequentium comparatum) (vide figuram)

Post sync pulsum recipitur, computatrale commemorat unumquemque ortum/decidentem signi, durationem suam metiens. Si duratio minus certo limite est, bit 1 memoriae scribitur, secus 0. In bytes colligentur et processus repetitur donec N bytes recipiantur. Numerus N plerumque sumi solet ex tabulae receptae titulo. Sequentia onerandi haec est:

  1. gubernator sono
  2. header (longitudo) continet magnitudinem data (N), file nominis et generis
  3. gubernator sono
  4. notitia ipsa

Fac ut notitia recte oneratur, Spectrum Saxo sic appellatum legit pari byte (par byte), quae computatur cum fasciculi servati per XORing omnes bytes notitiarum scriptionum. Cum tabellam legit, computator par byte e notitia accepta computat et, si eventus ab uno servato differt, errorem nuntium "R Tape oneratisque errorem ostendit". Proprie loquendo, computator hunc nuntium anteferre potest si, cum legeretur, pulsum agnoscere non potest (desideratur vel eius duratio certis limitibus non respondet)

Nunc igitur videamus quid simile signum incognitum sit.

Quomodo recepi notitia in forma ignota ex magnetica tape

Gubernator tonus est. Figura signi est signanter diversa, sed patet signum consistere in frequentia quadam repetitionis brevium pulsuum. Ad sampling frequentiam 44100 Hz, intervallum inter "cacumina" est circiter 48 exempla (quae frequentiae ~918 Hz respondet). Huius figurae meminerimus.

Nunc videamus fragmentum notitiarum:

Quomodo recepi notitia in forma ignota ex magnetica tape

Si distantiam inter pulsuum singularum metimur, evenit ut distantia inter pulsuum "longorum" exempla adhuc 48, et inter brevia. Prospiciens paululum, dicam in fine evenisse "reference" pulsus cum frequentia 24 Hz continuo sequi, ab initio ad finem tabellae. Assumi potest quod, cum notitia transmittendi, si pulsus accessus inter pulsus referat congressus est, consideremus illam pro I bit, secus 918 .

Quid de sync pulsus? Intueamur principium notitiarum:

Quomodo recepi notitia in forma ignota ex magnetica tape

Gubernator sono et notitia statim incipit. Paulo post, post varias varias tabulas analyticas, invenire potuimus primam byte datarum semper eandem esse (10100101b, A5h). Computatrum incipit legere notitia postquam eam recipit.

Etiam attendere potes ad mutationem primae pulsus referentis statim post ultimum 1 in sync byte. Multo serius compertum est in processu notitiae recognitionis enucleandi, cum notitia ineunte tabella stabiliter legi non potuit.

Nunc conemur describere algorithmum quod processus tabellae audio et notitia onus.

Data loading

Primum videamus ad paucas suppositiones ad algorithmum simplex servandum;

  1. Files in forma WAV tantum considerabimus;
  2. Fasciculus audio inire debet a sono gubernatore et silentio in principio continere non debet
  3. Fons fasciculus debet habere ratem sampling of 44100 Hz. In hoc casu, distantia inter pulsus 48 exemplorum iam determinata est et programmatice computare non oportet;
  4. Forma specimen aliquod esse potest (8/16 bits/fluitantis punctum) β€” cum legere possumus eam ad desideratum convertere;
  5. Ponamus fasciculi fontem amplitudine normali, quae exitum stabilire debet;

Lectio algorithmus talis erit.

  1. Tabella in memoriam legimus, simulque formato ad 8 particulas convertens;
  2. Determinare positionem primae venae in notitia auditionis. Ad hoc, exemplum cum maxima amplitudine calculare debes. Pro simplici semel manuale computabimus. Eamus eam ad prev_pos variabiles;
  3. 48 adde positioni pulsus ultimi (pos := prev_pos + 48)
  4. Cum positio augeatur per 48, non praestabit nos ad positionem proximae pulsus referentiae (defectus taenia, instabiles operationes machinae machinae machinae, etc.), necesse est ut positionem pul- puli pos- se accommodent. Ad hoc faciendum, sume particulam notitiarum (pos-8;pos+8) et maximam amplitudinis valorem in eo invenies. Positio maxima respondet in pos. Hic 8 = 48/6 experimentum constantem obtinet, quae cautiones ad maximum rectos determinabimus nec alios motus proximos afficiet. In gravissimis casibus, cum distantia inter pulsus multo minus quam 48 vel major, coactum pulsum investigare potes, sed intra articulum ambitum hoc in algorithmo non describemus;
  5. In priore gradu, etiam necesse est inhiberi quod relatio leguminis omnino inventa est. Hoc est, si maximum simpliciter requiris, non spondet impetum in hac parte esse. In ultima exsequenda lectionis progressione, discrimen inter maximum et minimum amplitudinis valores in segmento inspicio, et si certum modum excedit, impulsum praesentiam duco. Quaeritur etiam quid faciendum si relatio leguminis non invenitur. Exstant 2 optiones: vel notitia finita et silentium sequitur, vel haec lectio erroris habenda esse debet. Sed hoc omittemus algorithmum simpliciorem esse;
  6. Proximo gradu, praesentiam datae pulsus (bit 0 vel 1) determinare oportet, hoc enim sumimus segmentum medium (prev_pos; pos) middle_pos aequale middle_pos := (prev_pos+pos)/2 et in nonnullis viciniis medii_pos in segmento (middle_pos-8; middle_pos +8) maximam et minimam amplitudinem computamus. Si plus quam X differentia est, scribemus particulam 10 in eventum, alioquin 1. 0 constant experimento consecuta est;
  7. Servo current situ in prev_pos (prev_pos := pos)
  8. Repetere incipiens a gradu III usque ad totam fasciculum legamus;
  9. Inde ordinata frenum servari debent sicut statuto bytes. Cum sync byte legendi rationem non habuimus, numerus bitorum multiplex esse non potest 8, et frenum debiti cinguli etiam ignotus est. In prima algorithmi exsecutione, de exsistentia sync byte synthesis nesciebam et ideo simpliciter 8 fasciculos servavit cum diversis numeris cinguli frenorum. Una earum recta notitia continebat. In algorithmo finali, simpliciter omnes particulas removeo usque ad A5h, quod me permittit statim ut lima output rectam acquiram.

Algorithmus in Ruby, pro iis, quorum interest
Ruby ut linguam scribendam delegi, quia... I. Programma in eo maxime temporis. Optio non est summus perficientur, sed munus celeritatis lectionis quam celerrime non valet.

# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 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*")

exitum

Pluribus variantibus algorithm et constantibus experta, felix fui ut aliquid valde jucundum acciperem;

Quomodo recepi notitia in forma ignota ex magnetica tape

Ita, chordarum indolem diiudicantes, rationem habemus ad graphs tendendi. Nihilominus keywords nullae sunt in textu programmatis. Omnia keywords ut bytes encoded (singuli valoris 80h>). Nunc quaerendum est quemnam computatorium e 80s programmatibus in hac forma servare potuissent.

Re vera, simillima est programmatis fundamentalis. Spectrum computatorium Saxo programmatum in eadem fere forma in memoria tenet et programmata ad taenia servat. Modo in casu, repressi keywords contra mensa. Sed eventus erat negativus manifesto.

Etiam tesseras fundamentales popularium Atari, Commodore 64 et compluribus aliis illius temporis computatoribus compressi, quibus documenta invenire potui, sed sine successu - scientia mea formarum retro computatorum non tam latae evasit.

Tum constitui ire quod albumet tunc obtutus meus incidit in nomen fabricae radiophonicae Shack et trS-80 computatorium. Haec sunt nomina quae scripta sunt in pittaciis retis quae in mensa mea iacebant! Haec nomina antea nesciebam et cum computatro TRS-80 nota non erat, ideo mihi visum est radiophonium Shack fuisse fabricam audio ut BASF, Sony vel TDK, et TRS-80 tempus erat playback. Cur non?

Computer Tandy/Radio Shack TRS-80

Verisimile est tabulas audio in quaestione, quam exemplum dedi in principio articuli, in computatrale hoc modo factum est:

Quomodo recepi notitia in forma ignota ex magnetica tape

Evenit ut hoc computatorium eiusque varietates (model I/Model III/Model IV, etc.) valde populares essent uno tempore (sane non in Russia). Z80 Notabile est quod etiam processus utebantur. Hoc computatrum in Interreti invenire potes multum notitia. In 80s, informationes computatrales distributae sunt divulgationis. In momento plures sunt aemulatores computers pro diversis suggestis.

I downloaded aemulator trs80gp * ac primum videre potui quomodo haec computatralis operata est. Scilicet, computatrum output color non sustinebat, solutionis screen solum 128x48 elementa erat, sed multae extensiones et modificationes erant quae solutionem screen augere poterant. Multae quoque optiones ad systemata operandi huius computatorii et optiones ad exsequendam linguam fundamentalem (quae, secus ac ZX Imaginis, in quibusdam exemplaribus "emicata" in ROM non fuit et quaelibet optio ex floppy orbis onerari posset, sicuti ad OS ipsum)

Ego quoque inveni utilitatem tabulas audio in CAS formas convertere, quae ab emulatoribus suffragantur, sed aliqua de causa tabulas e retis meis utentes legere non potui.

CAS formae documenti figurato (quod paulum evasit exemplum notitiarum e machinae quam iam in manu habui, excepto capite cum praesentia sync byte), feci. paucae mutationes programmatis meae et CAS tabellae quae operanti aemulatori operanti praescribere poterat (TRS-80 III exemplar);

Quomodo recepi notitia in forma ignota ex magnetica tape

Utilitatem conversionis in versione novissimam designavi cum determinatione latae sententiae primi pulsus et distantiam inter pulsus referendi quasi sarcinam GEMMA, fons codicei praesto est. Github.

conclusio,

Iter peregimus quod iter in praeteritum attrahenti evasit, et gaudeo quod in fine responsum inveni. Inter cetera ego;

  • Formam servandi notitias in Saxo Imaginis figuravi et aedificatis in ROM consuetudines servandi / legendi notitia ex reta audio
  • Cognitus sum cum TRS-80 computatoriis eiusque varietates, systematis operandi pervestigavi, programmatum specimen spectavi atque etiam occasionem debugging in codicibus machinae (post omnia, omnia Z80 mnemonica mihi nota sunt)
  • Scripsit plenam discriminis utilitatem ad CAS formas tabulas convertendas, quae notitias legere potest quae utilitas "officialis" non agnoscitur.

Source: www.habr.com