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.
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;
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:
- gubernator sono
- header (longitudo) continet magnitudinem data (N), file nominis et generis
- gubernator sono
- 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.
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:
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:
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;
- Files in forma WAV tantum considerabimus;
- Fasciculus audio inire debet a sono gubernatore et silentio in principio continere non debet
- 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;
- Forma specimen aliquod esse potest (8/16 bits/fluitantis punctum) β cum legere possumus eam ad desideratum convertere;
- Ponamus fasciculi fontem amplitudine normali, quae exitum stabilire debet;
Lectio algorithmus talis erit.
- Tabella in memoriam legimus, simulque formato ad 8 particulas convertens;
- 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;
- 48 adde positioni pulsus ultimi (pos := prev_pos + 48)
- 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;
- 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;
- 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;
- Servo current situ in prev_pos (prev_pos := pos)
- Repetere incipiens a gradu III usque ad totam fasciculum legamus;
- 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;
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
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
Computer Tandy/Radio Shack TRS-80
Verisimile est tabulas audio in quaestione, quam exemplum dedi in principio articuli, in computatrale hoc modo factum est:
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
I downloaded aemulator
Ego quoque inveni
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);
Utilitatem conversionis in versione novissimam designavi cum determinatione latae sententiae primi pulsus et distantiam inter pulsus referendi quasi sarcinam GEMMA, fons codicei praesto est.
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