ಪೂರ್ವೇತಿಹಾಸದ
ರೆಟ್ರೊ ಹಾರ್ಡ್ವೇರ್ನ ಪ್ರೇಮಿಯಾಗಿರುವ ನಾನು ಒಮ್ಮೆ ಯುಕೆಯಲ್ಲಿನ ಮಾರಾಟಗಾರರಿಂದ ZX ಸ್ಪೆಕ್ಟ್ರಮ್+ ಅನ್ನು ಖರೀದಿಸಿದೆ. ಕಂಪ್ಯೂಟರ್ನೊಂದಿಗೆ ಸ್ವತಃ ಸೇರಿಸಲಾಗಿದೆ, ನಾನು ಆಟಗಳೊಂದಿಗೆ ಹಲವಾರು ಆಡಿಯೊ ಕ್ಯಾಸೆಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಿದ್ದೇನೆ (ಸೂಚನೆಗಳೊಂದಿಗೆ ಮೂಲ ಪ್ಯಾಕೇಜಿಂಗ್ನಲ್ಲಿ), ಹಾಗೆಯೇ ವಿಶೇಷ ಗುರುತುಗಳಿಲ್ಲದೆ ಕ್ಯಾಸೆಟ್ಗಳಲ್ಲಿ ರೆಕಾರ್ಡ್ ಮಾಡಲಾದ ಕಾರ್ಯಕ್ರಮಗಳು. ಆಶ್ಚರ್ಯಕರವಾಗಿ, 40 ವರ್ಷ ವಯಸ್ಸಿನ ಕ್ಯಾಸೆಟ್ಗಳಿಂದ ಡೇಟಾವನ್ನು ಚೆನ್ನಾಗಿ ಓದಬಹುದಾಗಿತ್ತು ಮತ್ತು ನಾನು ಅವರಿಂದ ಬಹುತೇಕ ಎಲ್ಲಾ ಆಟಗಳು ಮತ್ತು ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಯಿತು.
ಆದಾಗ್ಯೂ, ಕೆಲವು ಕ್ಯಾಸೆಟ್ಗಳಲ್ಲಿ ನಾನು ZX ಸ್ಪೆಕ್ಟ್ರಮ್ ಕಂಪ್ಯೂಟರ್ನಿಂದ ಸ್ಪಷ್ಟವಾಗಿ ಮಾಡದ ರೆಕಾರ್ಡಿಂಗ್ಗಳನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೇನೆ. ಅವರು ಸಂಪೂರ್ಣವಾಗಿ ವಿಭಿನ್ನವಾಗಿ ಧ್ವನಿಸಿದರು ಮತ್ತು ಉಲ್ಲೇಖಿಸಲಾದ ಕಂಪ್ಯೂಟರ್ನಿಂದ ರೆಕಾರ್ಡಿಂಗ್ಗಳಿಗಿಂತ ಭಿನ್ನವಾಗಿ, ಅವರು ಚಿಕ್ಕ ಬೇಸಿಕ್ ಬೂಟ್ಲೋಡರ್ನೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸಲಿಲ್ಲ, ಇದು ಸಾಮಾನ್ಯವಾಗಿ ಎಲ್ಲಾ ಪ್ರೋಗ್ರಾಂಗಳು ಮತ್ತು ಆಟಗಳ ರೆಕಾರ್ಡಿಂಗ್ಗಳಲ್ಲಿ ಇರುತ್ತದೆ.
ಸ್ವಲ್ಪ ಸಮಯದವರೆಗೆ ಇದು ನನ್ನನ್ನು ಕಾಡುತ್ತಿತ್ತು - ಅವುಗಳಲ್ಲಿ ಏನನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ ಎಂಬುದನ್ನು ಕಂಡುಹಿಡಿಯಲು ನಾನು ನಿಜವಾಗಿಯೂ ಬಯಸುತ್ತೇನೆ. ನೀವು ಆಡಿಯೊ ಸಿಗ್ನಲ್ ಅನ್ನು ಬೈಟ್ಗಳ ಅನುಕ್ರಮವಾಗಿ ಓದಲು ಸಾಧ್ಯವಾದರೆ, ನೀವು ಅಕ್ಷರಗಳನ್ನು ಅಥವಾ ಸಿಗ್ನಲ್ನ ಮೂಲವನ್ನು ಸೂಚಿಸುವ ಯಾವುದನ್ನಾದರೂ ಹುಡುಕಬಹುದು. ಒಂದು ರೀತಿಯ ರೆಟ್ರೊ-ಆರ್ಕಿಯಾಲಜಿ.
ಈಗ ನಾನು ಎಲ್ಲಾ ರೀತಿಯಲ್ಲಿ ಹೋಗಿದ್ದೇನೆ ಮತ್ತು ಕ್ಯಾಸೆಟ್ಗಳ ಲೇಬಲ್ಗಳನ್ನು ನೋಡುತ್ತೇನೆ, ಏಕೆಂದರೆ ನಾನು ನಗುತ್ತೇನೆ
ಉತ್ತರವು ನನ್ನ ಕಣ್ಣ ಮುಂದೆಯೇ ಇತ್ತು
ಎಡ ಕ್ಯಾಸೆಟ್ನ ಲೇಬಲ್ನಲ್ಲಿ ಟಿಆರ್ಎಸ್ -80 ಕಂಪ್ಯೂಟರ್ನ ಹೆಸರು, ಮತ್ತು ತಯಾರಕರ ಹೆಸರಿನ ಕೆಳಗೆ: “ಯುಎಸ್ಎಯಲ್ಲಿ ರೇಡಿಯೋ ಶಾಕ್ನಿಂದ ತಯಾರಿಸಲ್ಪಟ್ಟಿದೆ”
(ನೀವು ಒಳಸಂಚುಗಳನ್ನು ಕೊನೆಯವರೆಗೂ ಇರಿಸಿಕೊಳ್ಳಲು ಬಯಸಿದರೆ, ಸ್ಪಾಯ್ಲರ್ ಅಡಿಯಲ್ಲಿ ಹೋಗಬೇಡಿ)
ಆಡಿಯೊ ಸಂಕೇತಗಳ ಹೋಲಿಕೆ
ಮೊದಲನೆಯದಾಗಿ, ಆಡಿಯೊ ರೆಕಾರ್ಡಿಂಗ್ಗಳನ್ನು ಡಿಜಿಟೈಸ್ ಮಾಡೋಣ. ಅದು ಹೇಗೆ ಧ್ವನಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ನೀವು ಕೇಳಬಹುದು:
ಮತ್ತು ಎಂದಿನಂತೆ ZX ಸ್ಪೆಕ್ಟ್ರಮ್ ಕಂಪ್ಯೂಟರ್ನಿಂದ ರೆಕಾರ್ಡಿಂಗ್ ಧ್ವನಿಸುತ್ತದೆ:
ಎರಡೂ ಸಂದರ್ಭಗಳಲ್ಲಿ, ರೆಕಾರ್ಡಿಂಗ್ ಆರಂಭದಲ್ಲಿ ಕರೆಯಲ್ಪಡುವ ಒಂದು ಇರುತ್ತದೆ ಪೈಲಟ್ ಟೋನ್ - ಅದೇ ಆವರ್ತನದ ಧ್ವನಿ (ಮೊದಲ ರೆಕಾರ್ಡಿಂಗ್ನಲ್ಲಿ ಇದು ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದೆ <1 ಸೆಕೆಂಡ್, ಆದರೆ ಪ್ರತ್ಯೇಕಿಸಬಹುದಾಗಿದೆ). ಪೈಲಟ್ ಟೋನ್ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸಲು ಸಿದ್ಧಪಡಿಸುವಂತೆ ಸಂಕೇತಿಸುತ್ತದೆ. ನಿಯಮದಂತೆ, ಪ್ರತಿ ಕಂಪ್ಯೂಟರ್ ಸಿಗ್ನಲ್ ಮತ್ತು ಅದರ ಆವರ್ತನದ ಆಕಾರದಿಂದ ಅದರ "ಸ್ವಂತ" ಪೈಲಟ್ ಟೋನ್ ಅನ್ನು ಮಾತ್ರ ಗುರುತಿಸುತ್ತದೆ.
ಸಿಗ್ನಲ್ ಆಕಾರದ ಬಗ್ಗೆ ಏನನ್ನಾದರೂ ಹೇಳುವುದು ಅವಶ್ಯಕ. ಉದಾಹರಣೆಗೆ, ZX ಸ್ಪೆಕ್ಟ್ರಮ್ನಲ್ಲಿ ಅದರ ಆಕಾರವು ಆಯತಾಕಾರದದ್ದಾಗಿದೆ:
ಪೈಲಟ್ ಟೋನ್ ಪತ್ತೆಯಾದಾಗ, ಸಿಗ್ನಲ್ ಅನ್ನು ಗುರುತಿಸಲಾಗಿದೆ ಎಂದು ಸೂಚಿಸಲು ZX ಸ್ಪೆಕ್ಟ್ರಮ್ ಪರದೆಯ ಗಡಿಯಲ್ಲಿ ಪರ್ಯಾಯ ಕೆಂಪು ಮತ್ತು ನೀಲಿ ಬಾರ್ಗಳನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ. ಪೈಲಟ್ ಟೋನ್ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ ಸಿಂಕ್ರೊ ನಾಡಿ, ಇದು ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸಲು ಪ್ರಾರಂಭಿಸಲು ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಸಂಕೇತಿಸುತ್ತದೆ. ಇದು ಕಡಿಮೆ ಅವಧಿಯಿಂದ ನಿರೂಪಿಸಲ್ಪಟ್ಟಿದೆ (ಪೈಲಟ್ ಟೋನ್ ಮತ್ತು ನಂತರದ ಡೇಟಾಕ್ಕೆ ಹೋಲಿಸಿದರೆ) (ಚಿತ್ರವನ್ನು ನೋಡಿ)
ಸಿಂಕ್ ಪಲ್ಸ್ ಅನ್ನು ಸ್ವೀಕರಿಸಿದ ನಂತರ, ಕಂಪ್ಯೂಟರ್ ಸಿಗ್ನಲ್ನ ಪ್ರತಿ ಏರಿಕೆ / ಕುಸಿತವನ್ನು ದಾಖಲಿಸುತ್ತದೆ, ಅದರ ಅವಧಿಯನ್ನು ಅಳೆಯುತ್ತದೆ. ಅವಧಿಯು ನಿರ್ದಿಷ್ಟ ಮಿತಿಗಿಂತ ಕಡಿಮೆಯಿದ್ದರೆ, ಬಿಟ್ 1 ಅನ್ನು ಮೆಮೊರಿಗೆ ಬರೆಯಲಾಗುತ್ತದೆ, ಇಲ್ಲದಿದ್ದರೆ 0. ಬಿಟ್ಗಳನ್ನು ಬೈಟ್ಗಳಾಗಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ ಮತ್ತು N ಬೈಟ್ಗಳನ್ನು ಸ್ವೀಕರಿಸುವವರೆಗೆ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪುನರಾವರ್ತಿಸಲಾಗುತ್ತದೆ. ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಫೈಲ್ನ ಹೆಡರ್ನಿಂದ ಸಂಖ್ಯೆ N ಅನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತದೆ. ಲೋಡಿಂಗ್ ಅನುಕ್ರಮವು ಈ ಕೆಳಗಿನಂತಿರುತ್ತದೆ:
- ಪೈಲಟ್ ಟೋನ್
- ಹೆಡರ್ (ಸ್ಥಿರ ಉದ್ದ), ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಡೇಟಾದ ಗಾತ್ರ (N), ಫೈಲ್ ಹೆಸರು ಮತ್ತು ಪ್ರಕಾರವನ್ನು ಒಳಗೊಂಡಿದೆ
- ಪೈಲಟ್ ಟೋನ್
- ಡೇಟಾ ಸ್ವತಃ
ಡೇಟಾವನ್ನು ಸರಿಯಾಗಿ ಲೋಡ್ ಮಾಡಲಾಗಿದೆಯೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು, ZX ಸ್ಪೆಕ್ಟ್ರಮ್ ಕರೆಯಲ್ಪಡುವದನ್ನು ಓದುತ್ತದೆ ಸಮಾನತೆ ಬೈಟ್ (ಪ್ಯಾರಿಟಿ ಬೈಟ್), ಲಿಖಿತ ಡೇಟಾದ ಎಲ್ಲಾ ಬೈಟ್ಗಳನ್ನು XOR ಮಾಡುವ ಮೂಲಕ ಫೈಲ್ ಅನ್ನು ಉಳಿಸುವಾಗ ಲೆಕ್ಕಹಾಕಲಾಗುತ್ತದೆ. ಫೈಲ್ ಅನ್ನು ಓದುವಾಗ, ಕಂಪ್ಯೂಟರ್ ಸ್ವೀಕರಿಸಿದ ಡೇಟಾದಿಂದ ಪ್ಯಾರಿಟಿ ಬೈಟ್ ಅನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತದೆ ಮತ್ತು ಫಲಿತಾಂಶವು ಉಳಿಸಿದ ಒಂದಕ್ಕಿಂತ ಭಿನ್ನವಾಗಿದ್ದರೆ, "ಆರ್ ಟೇಪ್ ಲೋಡಿಂಗ್ ದೋಷ" ದೋಷ ಸಂದೇಶವನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ. ಕಟ್ಟುನಿಟ್ಟಾಗಿ ಹೇಳುವುದಾದರೆ, ಓದುವಾಗ, ಅದು ನಾಡಿಯನ್ನು ಗುರುತಿಸದಿದ್ದರೆ (ತಪ್ಪಿಹೋದ ಅಥವಾ ಅದರ ಅವಧಿಯು ಕೆಲವು ಮಿತಿಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗದಿದ್ದರೆ) ಕಂಪ್ಯೂಟರ್ ಈ ಸಂದೇಶವನ್ನು ಮೊದಲೇ ನೀಡಬಹುದು.
ಆದ್ದರಿಂದ, ಅಜ್ಞಾತ ಸಿಗ್ನಲ್ ಹೇಗೆ ಕಾಣುತ್ತದೆ ಎಂಬುದನ್ನು ಈಗ ನೋಡೋಣ:
ಇದು ಪೈಲಟ್ ಟೋನ್. ಸಂಕೇತದ ಆಕಾರವು ಗಮನಾರ್ಹವಾಗಿ ವಿಭಿನ್ನವಾಗಿದೆ, ಆದರೆ ಸಿಗ್ನಲ್ ನಿರ್ದಿಷ್ಟ ಆವರ್ತನದ ಸಣ್ಣ ದ್ವಿದಳ ಧಾನ್ಯಗಳನ್ನು ಪುನರಾವರ್ತಿಸುವುದನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ ಎಂಬುದು ಸ್ಪಷ್ಟವಾಗಿದೆ. 44100 Hz ನ ಮಾದರಿ ಆವರ್ತನದಲ್ಲಿ, "ಶಿಖರಗಳ" ನಡುವಿನ ಅಂತರವು ಸರಿಸುಮಾರು 48 ಮಾದರಿಗಳಾಗಿರುತ್ತದೆ (ಇದು ~918 Hz ಆವರ್ತನಕ್ಕೆ ಅನುರೂಪವಾಗಿದೆ). ಈ ಅಂಕಿ ಅಂಶವನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳೋಣ.
ಈಗ ಡೇಟಾ ತುಣುಕನ್ನು ನೋಡೋಣ:
ನಾವು ಪ್ರತ್ಯೇಕ ದ್ವಿದಳ ಧಾನ್ಯಗಳ ನಡುವಿನ ಅಂತರವನ್ನು ಅಳತೆ ಮಾಡಿದರೆ, "ಉದ್ದ" ದ್ವಿದಳ ಧಾನ್ಯಗಳ ನಡುವಿನ ಅಂತರವು ಇನ್ನೂ ~ 48 ಮಾದರಿಗಳು ಮತ್ತು ಚಿಕ್ಕವುಗಳ ನಡುವೆ - ~ 24 ಎಂದು ತಿರುಗುತ್ತದೆ. ಸ್ವಲ್ಪ ಮುಂದೆ ನೋಡಿದಾಗ, ಕೊನೆಯಲ್ಲಿ 918 Hz ಆವರ್ತನದೊಂದಿಗೆ “ಉಲ್ಲೇಖ” ಕಾಳುಗಳು ಫೈಲ್ನ ಪ್ರಾರಂಭದಿಂದ ಕೊನೆಯವರೆಗೆ ನಿರಂತರವಾಗಿ ಅನುಸರಿಸುತ್ತವೆ ಎಂದು ನಾನು ಹೇಳುತ್ತೇನೆ. ಡೇಟಾವನ್ನು ರವಾನಿಸುವಾಗ, ಉಲ್ಲೇಖಿತ ದ್ವಿದಳ ಧಾನ್ಯಗಳ ನಡುವೆ ಹೆಚ್ಚುವರಿ ಪಲ್ಸ್ ಎದುರಾದರೆ, ನಾವು ಅದನ್ನು ಬಿಟ್ 1 ಎಂದು ಪರಿಗಣಿಸುತ್ತೇವೆ, ಇಲ್ಲದಿದ್ದರೆ 0 ಎಂದು ಭಾವಿಸಬಹುದು.
ಸಿಂಕ್ ಪಲ್ಸ್ ಬಗ್ಗೆ ಏನು? ಡೇಟಾದ ಪ್ರಾರಂಭವನ್ನು ನೋಡೋಣ:
ಪೈಲಟ್ ಟೋನ್ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಡೇಟಾ ತಕ್ಷಣವೇ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ. ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ, ಹಲವಾರು ವಿಭಿನ್ನ ಆಡಿಯೊ ರೆಕಾರ್ಡಿಂಗ್ಗಳನ್ನು ವಿಶ್ಲೇಷಿಸಿದ ನಂತರ, ಡೇಟಾದ ಮೊದಲ ಬೈಟ್ ಯಾವಾಗಲೂ ಒಂದೇ ಆಗಿರುತ್ತದೆ ಎಂದು ನಾವು ಕಂಡುಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಯಿತು (10100101b, A5h). ಕಂಪ್ಯೂಟರ್ ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸಿದ ನಂತರ ಅದನ್ನು ಓದಲು ಪ್ರಾರಂಭಿಸಬಹುದು.
ಸಿಂಕ್ ಬೈಟ್ನಲ್ಲಿ ಕೊನೆಯ 1 ನೇ ನಂತರ ತಕ್ಷಣವೇ ಮೊದಲ ಉಲ್ಲೇಖದ ಪಲ್ಸ್ನ ಶಿಫ್ಟ್ಗೆ ನೀವು ಗಮನ ಹರಿಸಬಹುದು. ಡೇಟಾ ಗುರುತಿಸುವಿಕೆ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸುವ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ಇದು ಬಹಳ ನಂತರ ಕಂಡುಹಿಡಿಯಲ್ಪಟ್ಟಿತು, ಫೈಲ್ನ ಆರಂಭದಲ್ಲಿ ಡೇಟಾವನ್ನು ಸ್ಥಿರವಾಗಿ ಓದಲು ಸಾಧ್ಯವಾಗದಿದ್ದಾಗ.
ಈಗ ಆಡಿಯೊ ಫೈಲ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಮತ್ತು ಡೇಟಾವನ್ನು ಲೋಡ್ ಮಾಡುವ ಅಲ್ಗಾರಿದಮ್ ಅನ್ನು ವಿವರಿಸಲು ಪ್ರಯತ್ನಿಸೋಣ.
ಡೇಟಾವನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ
ಮೊದಲಿಗೆ, ಅಲ್ಗಾರಿದಮ್ ಅನ್ನು ಸರಳವಾಗಿಡಲು ಕೆಲವು ಊಹೆಗಳನ್ನು ನೋಡೋಣ:
- ನಾವು ಫೈಲ್ಗಳನ್ನು WAV ಸ್ವರೂಪದಲ್ಲಿ ಮಾತ್ರ ಪರಿಗಣಿಸುತ್ತೇವೆ;
- ಆಡಿಯೊ ಫೈಲ್ ಪೈಲಟ್ ಟೋನ್ನೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಗಬೇಕು ಮತ್ತು ಆರಂಭದಲ್ಲಿ ಮೌನವನ್ನು ಹೊಂದಿರಬಾರದು
- ಮೂಲ ಫೈಲ್ 44100 Hz ನ ಮಾದರಿ ದರವನ್ನು ಹೊಂದಿರಬೇಕು. ಈ ಸಂದರ್ಭದಲ್ಲಿ, 48 ಮಾದರಿಗಳ ಉಲ್ಲೇಖ ದ್ವಿದಳ ಧಾನ್ಯಗಳ ನಡುವಿನ ಅಂತರವನ್ನು ಈಗಾಗಲೇ ನಿರ್ಧರಿಸಲಾಗಿದೆ ಮತ್ತು ನಾವು ಅದನ್ನು ಪ್ರೋಗ್ರಾಮಿಕ್ ಆಗಿ ಲೆಕ್ಕಾಚಾರ ಮಾಡುವ ಅಗತ್ಯವಿಲ್ಲ;
- ಮಾದರಿ ಸ್ವರೂಪವು ಯಾವುದಾದರೂ ಆಗಿರಬಹುದು (8/16 ಬಿಟ್ಗಳು/ಫ್ಲೋಟಿಂಗ್ ಪಾಯಿಂಟ್) - ಓದುವಾಗ ನಾವು ಅದನ್ನು ಬಯಸಿದ ಒಂದಕ್ಕೆ ಪರಿವರ್ತಿಸಬಹುದು;
- ಮೂಲ ಫೈಲ್ ಅನ್ನು ವೈಶಾಲ್ಯದಿಂದ ಸಾಮಾನ್ಯಗೊಳಿಸಲಾಗಿದೆ ಎಂದು ನಾವು ಭಾವಿಸುತ್ತೇವೆ, ಅದು ಫಲಿತಾಂಶವನ್ನು ಸ್ಥಿರಗೊಳಿಸುತ್ತದೆ;
ಓದುವ ಅಲ್ಗಾರಿದಮ್ ಈ ಕೆಳಗಿನಂತಿರುತ್ತದೆ:
- ನಾವು ಫೈಲ್ ಅನ್ನು ಮೆಮೊರಿಗೆ ಓದುತ್ತೇವೆ, ಅದೇ ಸಮಯದಲ್ಲಿ ಮಾದರಿ ಸ್ವರೂಪವನ್ನು 8 ಬಿಟ್ಗಳಿಗೆ ಪರಿವರ್ತಿಸುತ್ತೇವೆ;
- ಆಡಿಯೊ ಡೇಟಾದಲ್ಲಿ ಮೊದಲ ಪಲ್ಸ್ನ ಸ್ಥಾನವನ್ನು ನಿರ್ಧರಿಸಿ. ಇದನ್ನು ಮಾಡಲು, ನೀವು ಗರಿಷ್ಠ ವೈಶಾಲ್ಯದೊಂದಿಗೆ ಮಾದರಿಯ ಸಂಖ್ಯೆಯನ್ನು ಲೆಕ್ಕ ಹಾಕಬೇಕು. ಸರಳತೆಗಾಗಿ, ನಾವು ಅದನ್ನು ಒಮ್ಮೆ ಹಸ್ತಚಾಲಿತವಾಗಿ ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತೇವೆ. ಅದನ್ನು prev_pos ವೇರಿಯೇಬಲ್ಗೆ ಉಳಿಸೋಣ;
- ಕೊನೆಯ ನಾಡಿಗೆ 48 ಅನ್ನು ಸೇರಿಸಿ (pos := prev_pos + 48)
- ಸ್ಥಾನವನ್ನು 48 ರಷ್ಟು ಹೆಚ್ಚಿಸುವುದರಿಂದ ನಾವು ಮುಂದಿನ ಉಲ್ಲೇಖದ ನಾಡಿ (ಟೇಪ್ ದೋಷಗಳು, ಟೇಪ್ ಡ್ರೈವ್ ಕಾರ್ಯವಿಧಾನದ ಅಸ್ಥಿರ ಕಾರ್ಯಾಚರಣೆ, ಇತ್ಯಾದಿ) ಸ್ಥಾನವನ್ನು ಪಡೆಯುತ್ತೇವೆ ಎಂದು ಖಾತರಿ ನೀಡುವುದಿಲ್ಲವಾದ್ದರಿಂದ, ನಾವು ಪೋಸ್ ಪಲ್ಸ್ನ ಸ್ಥಾನವನ್ನು ಸರಿಹೊಂದಿಸಬೇಕಾಗಿದೆ. ಇದನ್ನು ಮಾಡಲು, ಒಂದು ಸಣ್ಣ ಡೇಟಾವನ್ನು ತೆಗೆದುಕೊಳ್ಳಿ (pos-8;pos +8) ಮತ್ತು ಅದರ ಮೇಲೆ ಗರಿಷ್ಠ ವೈಶಾಲ್ಯ ಮೌಲ್ಯವನ್ನು ಕಂಡುಹಿಡಿಯಿರಿ. ಗರಿಷ್ಠಕ್ಕೆ ಅನುಗುಣವಾದ ಸ್ಥಾನವನ್ನು pos ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ. ಇಲ್ಲಿ 8 = 48/6 ಪ್ರಾಯೋಗಿಕವಾಗಿ ಪಡೆದ ಸ್ಥಿರವಾಗಿದೆ, ಇದು ನಾವು ಸರಿಯಾದ ಗರಿಷ್ಠವನ್ನು ನಿರ್ಧರಿಸುತ್ತೇವೆ ಮತ್ತು ಹತ್ತಿರದ ಇತರ ಪ್ರಚೋದನೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ ಎಂದು ಖಾತರಿಪಡಿಸುತ್ತದೆ. ಅತ್ಯಂತ ಕೆಟ್ಟ ಸಂದರ್ಭಗಳಲ್ಲಿ, ದ್ವಿದಳ ಧಾನ್ಯಗಳ ನಡುವಿನ ಅಂತರವು 48 ಕ್ಕಿಂತ ಕಡಿಮೆ ಅಥವಾ ಹೆಚ್ಚಿರುವಾಗ, ನೀವು ನಾಡಿಗಾಗಿ ಬಲವಂತದ ಹುಡುಕಾಟವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದು, ಆದರೆ ಲೇಖನದ ವ್ಯಾಪ್ತಿಯಲ್ಲಿ ನಾನು ಇದನ್ನು ಅಲ್ಗಾರಿದಮ್ನಲ್ಲಿ ವಿವರಿಸುವುದಿಲ್ಲ;
- ಹಿಂದಿನ ಹಂತದಲ್ಲಿ, ಉಲ್ಲೇಖದ ನಾಡಿ ಎಲ್ಲದರಲ್ಲೂ ಕಂಡುಬಂದಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುವುದು ಸಹ ಅಗತ್ಯವಾಗಿದೆ. ಅಂದರೆ, ನೀವು ಗರಿಷ್ಠವನ್ನು ಸರಳವಾಗಿ ನೋಡಿದರೆ, ಈ ವಿಭಾಗದಲ್ಲಿ ಉದ್ವೇಗವಿದೆ ಎಂದು ಇದು ಖಾತರಿಪಡಿಸುವುದಿಲ್ಲ. ಓದುವ ಕಾರ್ಯಕ್ರಮದ ನನ್ನ ಇತ್ತೀಚಿನ ಅನುಷ್ಠಾನದಲ್ಲಿ, ಒಂದು ವಿಭಾಗದಲ್ಲಿ ಗರಿಷ್ಠ ಮತ್ತು ಕನಿಷ್ಠ ವೈಶಾಲ್ಯ ಮೌಲ್ಯಗಳ ನಡುವಿನ ವ್ಯತ್ಯಾಸವನ್ನು ನಾನು ಪರಿಶೀಲಿಸುತ್ತೇನೆ ಮತ್ತು ಅದು ಒಂದು ನಿರ್ದಿಷ್ಟ ಮಿತಿಯನ್ನು ಮೀರಿದರೆ, ನಾನು ಪ್ರಚೋದನೆಯ ಉಪಸ್ಥಿತಿಯನ್ನು ಎಣಿಸುತ್ತೇನೆ. ರೆಫರೆನ್ಸ್ ಪಲ್ಸ್ ಸಿಗದಿದ್ದರೆ ಏನು ಮಾಡಬೇಕು ಎಂಬುದೂ ಪ್ರಶ್ನೆ. 2 ಆಯ್ಕೆಗಳಿವೆ: ಡೇಟಾ ಕೊನೆಗೊಂಡಿದೆ ಮತ್ತು ಮೌನ ಅನುಸರಿಸುತ್ತದೆ, ಅಥವಾ ಇದನ್ನು ಓದುವ ದೋಷವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಆದಾಗ್ಯೂ, ಅಲ್ಗಾರಿದಮ್ ಅನ್ನು ಸರಳಗೊಳಿಸಲು ನಾವು ಇದನ್ನು ಬಿಟ್ಟುಬಿಡುತ್ತೇವೆ;
- ಮುಂದಿನ ಹಂತದಲ್ಲಿ, ನಾವು ಡೇಟಾ ಪಲ್ಸ್ (ಬಿಟ್ 0 ಅಥವಾ 1) ಇರುವಿಕೆಯನ್ನು ನಿರ್ಧರಿಸಬೇಕಾಗಿದೆ, ಇದಕ್ಕಾಗಿ ನಾವು ವಿಭಾಗದ ಮಧ್ಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತೇವೆ (prev_pos;pos) mid_pos ಮಧ್ಯಮ_pos ಗೆ ಸಮನಾಗಿರುತ್ತದೆ := (prev_pos+pos)/2 ಮತ್ತು ವಿಭಾಗದಲ್ಲಿ ಮಿಡಲ್_ಪೋಸ್ನ ಕೆಲವು ನೆರೆಹೊರೆಯಲ್ಲಿ (ಮಧ್ಯ_ಪೋಸ್-8; ಮಿಡಲ್_ಪೋಸ್ +8) ನಾವು ಗರಿಷ್ಠ ಮತ್ತು ಕನಿಷ್ಠ ವೈಶಾಲ್ಯವನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡೋಣ. ಅವುಗಳ ನಡುವಿನ ವ್ಯತ್ಯಾಸವು 10 ಕ್ಕಿಂತ ಹೆಚ್ಚಿದ್ದರೆ, ನಾವು ಬಿಟ್ 1 ಅನ್ನು ಫಲಿತಾಂಶಕ್ಕೆ ಬರೆಯುತ್ತೇವೆ, ಇಲ್ಲದಿದ್ದರೆ 0. 10 ಪ್ರಾಯೋಗಿಕವಾಗಿ ಪಡೆದ ಸ್ಥಿರವಾಗಿರುತ್ತದೆ;
- ಪ್ರಸ್ತುತ ಸ್ಥಾನವನ್ನು prev_pos ನಲ್ಲಿ ಉಳಿಸಿ (prev_pos := pos)
- ನಾವು ಸಂಪೂರ್ಣ ಫೈಲ್ ಅನ್ನು ಓದುವವರೆಗೆ ಹಂತ 3 ರಿಂದ ಪ್ರಾರಂಭಿಸಿ;
- ಪರಿಣಾಮವಾಗಿ ಬಿಟ್ ಅರೇ ಅನ್ನು ಬೈಟ್ಗಳ ಸೆಟ್ನಂತೆ ಉಳಿಸಬೇಕು. ಓದುವಾಗ ನಾವು ಸಿಂಕ್ ಬೈಟ್ ಅನ್ನು ಗಣನೆಗೆ ತೆಗೆದುಕೊಳ್ಳದ ಕಾರಣ, ಬಿಟ್ಗಳ ಸಂಖ್ಯೆಯು 8 ರ ಬಹುಸಂಖ್ಯೆಯಾಗಿರಬಾರದು ಮತ್ತು ಅಗತ್ಯವಿರುವ ಬಿಟ್ ಆಫ್ಸೆಟ್ ಸಹ ತಿಳಿದಿಲ್ಲ. ಅಲ್ಗಾರಿದಮ್ನ ಮೊದಲ ಅನುಷ್ಠಾನದಲ್ಲಿ, ಸಿಂಕ್ ಬೈಟ್ನ ಅಸ್ತಿತ್ವದ ಬಗ್ಗೆ ನನಗೆ ತಿಳಿದಿರಲಿಲ್ಲ ಮತ್ತು ಆದ್ದರಿಂದ ವಿಭಿನ್ನ ಸಂಖ್ಯೆಯ ಆಫ್ಸೆಟ್ ಬಿಟ್ಗಳೊಂದಿಗೆ 8 ಫೈಲ್ಗಳನ್ನು ಸರಳವಾಗಿ ಉಳಿಸಿದೆ. ಅವುಗಳಲ್ಲಿ ಒಂದು ಸರಿಯಾದ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿತ್ತು. ಅಂತಿಮ ಅಲ್ಗಾರಿದಮ್ನಲ್ಲಿ, ನಾನು A5h ವರೆಗಿನ ಎಲ್ಲಾ ಬಿಟ್ಗಳನ್ನು ಸರಳವಾಗಿ ತೆಗೆದುಹಾಕುತ್ತೇನೆ, ಇದು ಸರಿಯಾದ ಔಟ್ಪುಟ್ ಫೈಲ್ ಅನ್ನು ತಕ್ಷಣವೇ ಪಡೆಯಲು ನನಗೆ ಅನುಮತಿಸುತ್ತದೆ
ಆಸಕ್ತರಿಗೆ ರೂಬಿಯಲ್ಲಿ ಅಲ್ಗಾರಿದಮ್
ಪ್ರೋಗ್ರಾಂ ಬರೆಯಲು ನಾನು ರೂಬಿಯನ್ನು ಭಾಷೆಯಾಗಿ ಆರಿಸಿದೆ, ಏಕೆಂದರೆ... ನಾನು ಹೆಚ್ಚಿನ ಸಮಯ ಅದರ ಮೇಲೆ ಪ್ರೋಗ್ರಾಂ ಮಾಡುತ್ತೇನೆ. ಆಯ್ಕೆಯು ಹೆಚ್ಚಿನ ಕಾರ್ಯಕ್ಷಮತೆಯಲ್ಲ, ಆದರೆ ಓದುವ ವೇಗವನ್ನು ಸಾಧ್ಯವಾದಷ್ಟು ವೇಗವಾಗಿ ಮಾಡುವ ಕಾರ್ಯವು ಯೋಗ್ಯವಾಗಿಲ್ಲ.
# Используем 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*")
ಪರಿಣಾಮವಾಗಿ
ಅಲ್ಗಾರಿದಮ್ ಮತ್ತು ಸ್ಥಿರಾಂಕಗಳ ಹಲವಾರು ರೂಪಾಂತರಗಳನ್ನು ಪ್ರಯತ್ನಿಸಿದ ನಂತರ, ನಾನು ಅತ್ಯಂತ ಆಸಕ್ತಿದಾಯಕವಾದದ್ದನ್ನು ಪಡೆಯಲು ಅದೃಷ್ಟಶಾಲಿಯಾಗಿದ್ದೆ:
ಆದ್ದರಿಂದ, ಪಾತ್ರದ ತಂತಿಗಳ ಮೂಲಕ ನಿರ್ಣಯಿಸುವುದು, ಗ್ರಾಫ್ಗಳನ್ನು ರೂಪಿಸಲು ನಾವು ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಹೊಂದಿದ್ದೇವೆ. ಆದಾಗ್ಯೂ, ಪ್ರೋಗ್ರಾಂ ಪಠ್ಯದಲ್ಲಿ ಯಾವುದೇ ಕೀವರ್ಡ್ಗಳಿಲ್ಲ. ಎಲ್ಲಾ ಕೀವರ್ಡ್ಗಳನ್ನು ಬೈಟ್ಗಳಾಗಿ ಎನ್ಕೋಡ್ ಮಾಡಲಾಗಿದೆ (ಪ್ರತಿ ಮೌಲ್ಯ > 80h). 80 ರ ದಶಕದಿಂದ ಯಾವ ಕಂಪ್ಯೂಟರ್ ಈ ಸ್ವರೂಪದಲ್ಲಿ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಉಳಿಸಬಹುದೆಂದು ಈಗ ನಾವು ಕಂಡುಹಿಡಿಯಬೇಕು.
ವಾಸ್ತವವಾಗಿ, ಇದು ಬೇಸಿಕ್ ಪ್ರೋಗ್ರಾಂಗೆ ಹೋಲುತ್ತದೆ. ZX ಸ್ಪೆಕ್ಟ್ರಮ್ ಕಂಪ್ಯೂಟರ್ ಮೆಮೊರಿಯಲ್ಲಿ ಸರಿಸುಮಾರು ಅದೇ ಸ್ವರೂಪದಲ್ಲಿ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ ಮತ್ತು ಟೇಪ್ಗೆ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಉಳಿಸುತ್ತದೆ. ಒಂದು ವೇಳೆ, ನಾನು ಕೀವರ್ಡ್ಗಳನ್ನು ವಿರುದ್ಧವಾಗಿ ಪರಿಶೀಲಿಸಿದ್ದೇನೆ
ನಾನು ಜನಪ್ರಿಯ ಅಟಾರಿ, ಕೊಮೊಡೋರ್ 64 ಮತ್ತು ಆ ಕಾಲದ ಹಲವಾರು ಇತರ ಕಂಪ್ಯೂಟರ್ಗಳ ಬೇಸಿಕ್ ಕೀವರ್ಡ್ಗಳನ್ನು ಸಹ ಪರಿಶೀಲಿಸಿದ್ದೇನೆ, ಇದಕ್ಕಾಗಿ ನಾನು ದಾಖಲಾತಿಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು ಸಾಧ್ಯವಾಯಿತು, ಆದರೆ ಯಶಸ್ವಿಯಾಗದೆ - ರೆಟ್ರೊ ಕಂಪ್ಯೂಟರ್ಗಳ ಪ್ರಕಾರಗಳ ಬಗ್ಗೆ ನನ್ನ ಜ್ಞಾನವು ಅಷ್ಟು ವಿಸ್ತಾರವಾಗಿಲ್ಲ.
ನಂತರ ನಾನು ಹೋಗಲು ನಿರ್ಧರಿಸಿದೆ
ಕಂಪ್ಯೂಟರ್ ಟ್ಯಾಂಡಿ/ರೇಡಿಯೋ ಶಾಕ್ ಟಿಆರ್ಎಸ್-80
ಲೇಖನದ ಆರಂಭದಲ್ಲಿ ನಾನು ಉದಾಹರಣೆಯಾಗಿ ನೀಡಿದ ಪ್ರಶ್ನೆಯಲ್ಲಿರುವ ಆಡಿಯೊ ರೆಕಾರ್ಡಿಂಗ್ ಅನ್ನು ಈ ರೀತಿಯ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಮಾಡಲಾಗಿದೆ:
ಈ ಕಂಪ್ಯೂಟರ್ ಮತ್ತು ಅದರ ಪ್ರಭೇದಗಳು (ಮಾದರಿ I / ಮಾಡೆಲ್ III / ಮಾಡೆಲ್ IV, ಇತ್ಯಾದಿ) ಒಂದು ಸಮಯದಲ್ಲಿ ಬಹಳ ಜನಪ್ರಿಯವಾಗಿವೆ (ಸಹಜವಾಗಿ, ರಷ್ಯಾದಲ್ಲಿ ಅಲ್ಲ). ಅವರು ಬಳಸಿದ ಪ್ರೊಸೆಸರ್ ಕೂಡ Z80 ಆಗಿತ್ತು ಎಂಬುದು ಗಮನಾರ್ಹ. ಈ ಕಂಪ್ಯೂಟರ್ಗಾಗಿ ನೀವು ಇಂಟರ್ನೆಟ್ನಲ್ಲಿ ಕಾಣಬಹುದು
ನಾನು ಎಮ್ಯುಲೇಟರ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ್ದೇನೆ
ನಾನು ಕೂಡ ಕಂಡುಕೊಂಡೆ
CAS ಫೈಲ್ ಫಾರ್ಮ್ಯಾಟ್ ಅನ್ನು ಕಂಡುಹಿಡಿದ ನಂತರ (ಇದು ಸಿಂಕ್ ಬೈಟ್ ಇರುವ ಹೆಡರ್ ಹೊರತುಪಡಿಸಿ, ನಾನು ಈಗಾಗಲೇ ಕೈಯಲ್ಲಿದ್ದ ಟೇಪ್ನಿಂದ ಡೇಟಾದ ಬಿಟ್-ಬೈ-ಬಿಟ್ ನಕಲು ಎಂದು ಹೊರಹೊಮ್ಮಿದೆ), ನಾನು ಮಾಡಿದ್ದೇನೆ ನನ್ನ ಪ್ರೋಗ್ರಾಂಗೆ ಕೆಲವು ಬದಲಾವಣೆಗಳು ಮತ್ತು ಎಮ್ಯುಲೇಟರ್ (TRS-80 ಮಾಡೆಲ್ III) ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುವ ಕೆಲಸ ಮಾಡುವ CAS ಫೈಲ್ ಅನ್ನು ಔಟ್ಪುಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಯಿತು:
GEM ಪ್ಯಾಕೇಜ್ನಂತೆ ಮೊದಲ ನಾಡಿ ಮತ್ತು ಉಲ್ಲೇಖದ ದ್ವಿದಳ ಧಾನ್ಯಗಳ ನಡುವಿನ ಅಂತರವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಧರಿಸುವ ಮೂಲಕ ನಾನು ಪರಿವರ್ತನೆಯ ಉಪಯುಕ್ತತೆಯ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಿದ್ದೇನೆ, ಮೂಲ ಕೋಡ್ ಇಲ್ಲಿ ಲಭ್ಯವಿದೆ
ತೀರ್ಮಾನಕ್ಕೆ
ನಾವು ಪ್ರಯಾಣಿಸಿದ ಮಾರ್ಗವು ಭೂತಕಾಲಕ್ಕೆ ಆಕರ್ಷಕ ಪ್ರಯಾಣವಾಗಿದೆ ಮತ್ತು ಕೊನೆಯಲ್ಲಿ ನಾನು ಉತ್ತರವನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೇನೆ ಎಂದು ನನಗೆ ಖುಷಿಯಾಗಿದೆ. ಇತರ ವಿಷಯಗಳ ಜೊತೆಗೆ, ನಾನು:
- ನಾನು ZX ಸ್ಪೆಕ್ಟ್ರಮ್ನಲ್ಲಿ ಡೇಟಾವನ್ನು ಉಳಿಸುವ ಸ್ವರೂಪವನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೇನೆ ಮತ್ತು ಆಡಿಯೊ ಕ್ಯಾಸೆಟ್ಗಳಿಂದ ಡೇಟಾವನ್ನು ಉಳಿಸಲು/ಓದಲು ಅಂತರ್ನಿರ್ಮಿತ ROM ದಿನಚರಿಗಳನ್ನು ಅಧ್ಯಯನ ಮಾಡಿದೆ
- ನಾನು ಟಿಆರ್ಎಸ್ -80 ಕಂಪ್ಯೂಟರ್ ಮತ್ತು ಅದರ ಪ್ರಭೇದಗಳೊಂದಿಗೆ ಪರಿಚಯವಾಯಿತು, ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಅನ್ನು ಅಧ್ಯಯನ ಮಾಡಿದೆ, ಮಾದರಿ ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ನೋಡಿದೆ ಮತ್ತು ಯಂತ್ರ ಸಂಕೇತಗಳಲ್ಲಿ ಡೀಬಗ್ ಮಾಡುವ ಅವಕಾಶವನ್ನು ಸಹ ಹೊಂದಿದ್ದೇನೆ (ಎಲ್ಲಾ ನಂತರ, ಎಲ್ಲಾ Z80 ಜ್ಞಾಪಕಗಳು ನನಗೆ ಪರಿಚಿತವಾಗಿವೆ)
- ಆಡಿಯೋ ರೆಕಾರ್ಡಿಂಗ್ಗಳನ್ನು CAS ಫಾರ್ಮ್ಯಾಟ್ಗೆ ಪರಿವರ್ತಿಸಲು ಪೂರ್ಣ ಪ್ರಮಾಣದ ಉಪಯುಕ್ತತೆಯನ್ನು ಬರೆಯಲಾಗಿದೆ, ಇದು "ಅಧಿಕೃತ" ಉಪಯುಕ್ತತೆಯಿಂದ ಗುರುತಿಸಲ್ಪಡದ ಡೇಟಾವನ್ನು ಓದಬಹುದು
ಮೂಲ: www.habr.com