Разобрать файл по битам
В общем, это информация для новичков. Когда пошла тема про считывание информации из файла, встал вопрос: если файл содержит буквы, то почему мы считываем из него цифры в виде байтов и чем является все-таки в таком случае байт. О том, что такое байт, уже достаточно хорошо написано здесь. Но, после прочтения, все равно остался вопрос механизма трансформации букв в цифры, пришлось немного поковыряться в интернете. Поэтому написанное ниже можно считать дополнением. Компьютер хранит каждый файл в виде информации состоящей из нулей и единиц в бинарной форме. Каждый файл фактически является набором байтов следующих один за другим. В типовом варианте существует два вида файлов с информацией: текстовый файл и бинарный файл. Текстовый файл содержит типовой человеческий набор читабельных символов, который мы можем открыть в любом текстовом редакторе. Бинарные файлы состоят из символов, которыми мы не привыкли оперировать в обычной жизни, соответственно требуется специальная программа,, способная их прочитать. Текстовые файлы состоят из букв, цифр и других общепринятых символов. Такие файлы имеют расширения .txt, .py, .csv и т.д. Когда мы открываем такой файл, то видим привычный набор символов, образующих слова. Хотя на самом деле это содержание внутри компьютера не хранится в таком виде. Оно хранится в виде битов, то есть 0 или 1. В различных кодировочных таблицах ASCII, UNICODE или какой другой значение каждого символа определено в бинарном виде. Соответственно, если байт может вмещать 256 символов, то каждому символу соответствует своя двоичная кодировка из нулей и единиц (восемь подряд записанных нулей или единиц дают один символ). Таким образом, когда файл открывается, текстовый редактор осуществляет перевод каждого значения ASCII в привычный нам символ и отображает его уже в привычном виде. Например, под номером 65 в бинарном виде кода ASCII идет 1000001, которое отобразится в файле латинской (не кириллица. Кириллица стартует со 192 позиции) буквой «А». То есть в системе ASCII байту со значением 1000001 соответствует значение латинской буквы «А». Каждая линия файла имеет свой знак переноса строки – EOL (End of Line). Часто этим символом (двумя символами) является «\n» (бинарное значение в ASCII: 00001010). Считав такой символ программа интерпретирует его как конец строки и переход на строку ниже. Есть другие подобные "функциональные символы". Бинарные файлы, как и текстовые, хранятся в бинарном виде, но к ним не «прилагается» программа, которая их раскодирует, то есть нет расшифровочной таблицы типа ASCII. В основном содержание таких файлов представляет собой картинки, аудио и видео, которые в свою очередь являются ужатыми версиями других файлов, например самовыполняющихся файлов (.ехе). Такие файлы (бинарные) не читаются человеком в обычном понимании, поэтому попытка открыть их привычными текстовыми редакторами отобразит кучу непонятного мусора. Соответственно для корректного чтения таких файлов выпускаются специальные программы. Бинарные файлы также хранятся в виде набора байтов, но в данном случае изменение хотя бы одного бита может сделать нечитабельным весь файл. Таблицу символов ASCII можно посмотреть здесь. Таким образом, когда мы читаем файл, то в переменную byte считываются по 8 символов (единица или ноль), которые затем могут быть конвертированы какой-либо программой типа Блокнот в читабельные символы. Источник, который помог разобраться.
Пару лет назад я начал создавать основу для создания музыки. Я делал это неосознанно во время практики, создавая новые треки.
Я собрал эти советы и стратегии. Их можно использовать для вдохновения, имитации других треков и изучения новых элементов музыки.
Вот полный рабочий процесс, над которым я работаю.
В ходе этого процесса существует три этапа:
- Анализ
- Разбивка
- Сборка по частям
Для разбора нет никаких шагов:
- Темп и ритм
- Музыкальная гамма
- Аккордовая последовательность
- Бас
- Барабаны
- Мелодии
- Звуковой дизайн
- Микширование
- Мастеринг
Другие системы счисления
Данные в памяти микроконтроллера хранятся в двоичном представлении, но помимо него существуют и другие системы счисления, в которых мы можем работать. Переводить числа из одной системы счисления в другую не нужно: программе абсолютно всё равно, в каком формате вы скармливаете значение переменной, они автоматически будут интерпретированы в двоичный вид. Разные системы счисления введены в первую очередь для удобства программиста.
Теперь по сути: Arduino поддерживает четыре классических системы счисления: двоичную, восьмеричную, десятичную и шестнадцатеричную.
- Двоичная (Binary) имеет префикс 0b (ноль бэ) или B, то есть двоичное число 101 запишется как 0b101 или B101 .
- С десятичной (DEC) всё просто, пишем числа так, как они выглядят. 10 это десять, 25 это двадцать пять и так далее.
- Восьмеричная (Octal) может содержать числа от 0 до 7 и имеет префикс 0 (ноль), например 012 .
- 16-ричная (hexademical) система имеет 16 значений на один разряд, первые 10 как у десятичной, остальные – первые буквы латинского алфавита: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f. При записи имеет префикс 0x (ноль икс), число FF19 запишется как 0xFF19 .
Основная фишка 16-ричной системы в том, что она позволяет записывать длинные десятичные числа короче, например один байт (255) запишется как 0xFF , два байта (65 535) как 0xFFFF , а жуткие три байта (16 777 215) как 0xFFFFFF .
Двоичная система обычно используется для наглядного представления данных и низкоуровневых конфигураций различного железа. Например конфиг кодируется одним байтом, каждый бит в нём отвечает за отдельную настройку (вкл/выкл), и передав один байт вида 0b10110100 можно сразу кучу всего настроить, к этому мы вернёмся в уроке работа с регистрами из раздела продвинутых уроков. В документации по этому поводу пишут в стиле “первый бит отвечает за это, второй за то” и так далее. Перейдём к изменению состояний битов.
C) Быстрые изменения
Цель состоит в том, чтобы быстро получить результаты без каких-либо препятствий. Решение - это зацикливать музыку, и во время прослушивания записывать аккорды и бас.
Затем вы меняете их шаг за шагом. Вы меняете один или два полутона за раз. Выполняя эти шаги, можно добраться до основы трека.
На первый взгляд это может показаться трудным, но всё придет с практикой. Просто начинайте и делайте работу. Вам разрешается допускать ошибки. Часто лучшая музыка основана на небольших ошибках; счастливые случайности.
Тонкая доработка композиции
Для этого достаточно пяти-десяти минут, и при необходимости полезно настроить или уменьшить пару полутонов. Вы также можете изменить ритм.
Вдохновение, копирование или воровство
Потому что идеи не могут быть защищены авторским правом, и вы не можете превратить их в стандарт. Это касается музыкальных идей.
Идеальное решение - это золотая середина: вы можете взять идеи, но вы должны немного поработать с ними, изменить и модифицировать их. Если вы будете брать идеи из многих музыкальных произведений, люди будут думать о вас как о гении.
Битовое НЕ
Битовая операция НЕ (NOT) выполняется оператором ~ и просто инвертирует бит:
Также она может инвертировать байт:
9. Мастеринг
Ответьте на свои собственные вопросы по мастерингу:
- Тон
- Динамика
- Громкость
- Контрольная/эталонная дорожка
2. Музыкальная гамма
Эти гаммы являются самыми популярными в западной музыке:
- Мажорная (7 нот), например. До-мажорная
- Минорная (7 нот), например. Ля-минорная
- Мажорная пентатоника (5 нот)
- Минорная пентатоника (5 нот)
Гаммы До-мажор и Ля-минор являются самыми простыми. Вам просто нужно использовать белые клавиши на клавиатуре.
5. Ударные
- Настроение: агрессивное, пассивное, нейтральное, легкое, игривое, медленное, быстрое
- Выбор инструмента
- Динамика
- Записи
Включаем-выключаем
Вспомним пример из пункта про битовое ИЛИ, про установку нужного бита. Вот эти варианты кода делают одно и то же:
Как насчёт установки нескольких бит сразу?
Или прицельного выключения бит? Тут чуть по-другому, используя &= и ~
Выключить несколько бит сразу? Пожалуйста!
Именно такие конструкции встречаются в коде высокого уровня и библиотеках, именно так производится работа с регистрами микроконтроллера. Вернёмся к устройству Ардуиновских макросов:
Я думаю, комментарии излишни: макросы состоят из тех же элементарных битовых операций и сдвигов!
Данные Beatport
На Beatport вы, как правило, можете найти темп музыки и музыкальную гамму.
Я иногда использую Beatport, чтобы найти информацию о тональности и темпе музыки
“Трюки” с битами
На битовых операциях можно сделать очень много всего интересного, и работать оно будет очень быстро и занимать мало места. Огромный список битовых трюков и хаков можно посмотреть в этой статье, их там очень много и все с примерами. Есть ещё один небольшой сборник самых простых и полезных хаков вот здесь (английский). Его я перевёл, смотрите ниже под спойлером. Другой вариант перевода (могут быть не все трюки) можно посмотреть здесь.
Перемотка бита
Перематывает один бит слева направо, то есть формирует последовательность 0b10000000, 0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001, 0b10000000 , или 128, 64, 32, 16, 8, 4, 2, 1, 128
← →чип ( 2005-05-26 20:39 ) [0]
Подскажите, можно ли считать файл в двоичном виде, не побайтно, а побитно, т.е. в виде 0 и 1. Имеется в виду не преобразовывать на ходу, а именно сразу читать побитно.
← →Просто Джо © ( 2005-05-26 20:39 ) [1]
Читать побитно нельзя.
← →KilkennyCat © ( 2005-05-26 20:44 ) [2]
сомневаюсь, что и побайтно можно.
← →VMcL © ( 2005-05-26 20:56 ) [3]
>>чип (26.05.05 20:39)
Файлы и так в двоичном виде. Переформулируйте вопрос. Что конкретно нужно?
← →чип ( 2005-05-26 21:05 ) [4]
VMcL
Вроде я написал понятно, что нужно - нужно прочитать файл по битам, т.е. последовательно получить значение каждого бита. Как прочитать побайтно- понятно, а можно ли по битам - вопрос.
Просто Джо © ( 2005-05-26 21:06 ) [5]
> [2] KilkennyCat © (26.05.05 20:44)
> сомневаюсь, что и побайтно можно.
Физически кажись, будет читать кластерами. Или секторами(?). Не помню. Но общераспространеные высокоуровневые функции создают все-таки иллюзию побайтного чтения.
А побитно - нельзя даже теоретически, поскольку - хардверные особенности.
Вообще, присоединяюсь к [3] VMcL © (26.05.05 20:56).
Yanis © ( 2005-05-26 21:07 ) [6]
To [4]
Тебе уже ответили.
Просто Джо © ( 2005-05-26 21:08 ) [7]
> [4] чип (26.05.05 21:05)
См. [1].
Что мешает читать как обычно, а потом уже анализировать нужные разряды в прочитанных данных?
чип ( 2005-05-26 21:12 ) [8]
> [7]
Технически ничего не мешает, но это ж лишние действия, соответственно, скорость чтения. Вопрос был в том, можно ли обойтись без этого
Просто Джо © ( 2005-05-26 21:14 ) [9]
> [8] чип (26.05.05 21:12)
.
Ты считаешь, что чтение побитно ускорило бы процесс?
чип ( 2005-05-26 21:16 ) [10]
> [9]
Я думаю, это было бы быстрее, нежели разбирать считанные байты по битам
Eraser © ( 2005-05-26 21:21 ) [11]
чип (26.05.05 20:39)
Байт - наименьшая адресуемая величина памяти. Так что нельзя.
← →GLFox © ( 2005-05-26 21:25 ) [12]
Вообще, если речь идет о скорости, то быстрее всего читать блоками гораздо большими чем один байт, а лучше размером с кластер. Доподлинно известно, что операции в RAM производятся быстрее, чем дисковые.
← →Yanis © ( 2005-05-26 21:26 ) [13]
Бстрее считать один байт и "обработать его процессором" чем ~256 раз считывать с диска по одному, пускай даже и биту.
← →Yanis © ( 2005-05-26 21:29 ) [14]
2 [12]
Опередил :)
Eraser © ( 2005-05-26 21:30 ) [15]
GLFox © (26.05.05 21:25) [12]
лучше размером с кластер. Доподлинно известно, что операции в RAM производятся быстрее, чем дисковые.
Если речь идёт о считывании из памяти, тогда уж лучше страницами памяти считывать.
← →GLFox © ( 2005-05-26 21:32 ) [16]
>>Eraser © (26.05.05 21:30) [15]
Речь идет о считывании с диска
VMcL © ( 2005-05-26 21:52 ) [17]
>>чип (26.05.05 21:16) [10]
Наоборот.
← →SergP © ( 2005-05-26 22:24 ) [18]
> чип (26.05.05 20:39)
> Подскажите, можно ли считать файл в двоичном виде, не побайтно,
> а побитно, т.е. в виде 0 и 1. Имеется в виду не преобразовывать
> на ходу, а именно сразу читать побитно.
То, что нельзя - это одно. Но вот зачем такое могло понадобиться - вот это интерестно.
← →Просто Джо © ( 2005-05-26 22:26 ) [19]
> [18] SergP © (26.05.05 22:24)
Но вот зачем такое могло понадобиться
> - вот это интерестно.
Человек утверждает, что "так быстрее" ;))
SergP © ( 2005-05-26 22:50 ) [20]
ну насколько я себе представляю - то считывание можно производить на физическом уровне - посекторно (по 512 байт), а на уровне BIOS (или ОС. ) - вообще покластерно. Конечно могу ошибаться, но по крайней мере уж никак побайтно, тем более побитно.
А то что:
> Человек утверждает, что "так быстрее" ;))
то это пройдет со временем. :-))
← →KilkennyCat © ( 2005-05-26 23:47 ) [21]
На мой взгляд, ошибка не в этом. Большая ошибка здесь:
> разбирать считанные байты по битам
Mx © ( 2005-05-26 23:53 ) [22]
А какой смысл в такой операции? Че то я не въезжаю. Открыл файлик и пошел, считал блок, проанализировал биты. От этого, как мне кажется, прога ничего в скорости не потеряет. Даже наоборот, меньше возьни со всякими низкоуровневыми менеджерами и т.п.
← →Marser © ( 2005-05-27 00:03 ) [23]
Нельзя.
← →Marser © ( 2005-05-27 00:04 ) [24]
> Человек утверждает, что "так быстрее" ;))
Ага. Только за то время, пока споследовательно пройдет бит, паралельно проскочит то ли 8, то ли 16, а то ли 32 :-)
Просто Джо © ( 2005-05-27 00:07 ) [25]
> [24] Marser © (27.05.05 00:04)
А это, мой юный друг, расскажите, пожалуйста, глубокоуважаемому Чипу :))
Тьху, совсем меня Керк и KilcennyCat с тона сбили :)
KilkennyCat © ( 2005-05-27 00:09 ) [26]
> [25] Просто Джо © (27.05.05 00:07)
Уверены? :))
← →Alex Konshin © ( 2005-05-27 00:32 ) [30]
Почему никто не задал вопрос на засыпку: "А в каком порядке должны считываться биты?"
← →Просто Джо © ( 2005-05-27 00:32 ) [31]
> [27] Игорь Шевченко © (27.05.05 00:22)
> А на диске файлы побитно лежат :P
Темное это дело, темное :))
Marser © ( 2005-05-27 00:34 ) [32]
> Темное это дело, темное :))
Давеча с Васьком открыли посмотреть чаво это в ейном винчестере за биты лежат. И нишиша там не было никаких битов, тока железяка какая-то.
KilkennyCat © ( 2005-05-27 00:39 ) [33]
> Давеча с Васьком открыли посмотреть чаво это в ейном винчестере
>
> "А в каком порядке должны считываться биты?"
В обратном записыванию, чтоб лишний раз голвами не дергать.
← →Просто Джо © ( 2005-05-27 00:51 ) [34]
Существование битов в природе наукой не доказано-с ;^)
← →KilkennyCat © ( 2005-05-27 01:27 ) [35]
Это [32] Marser © (27.05.05 00:34) - доказательство науки? :))
← →Просто Джо © ( 2005-05-27 01:28 ) [36]
> [35] KilkennyCat © (27.05.05 01:27)
Если у Васька - докторская степень, то придется, пожалуй, согласиться-с :)
Strech ( 2005-05-27 02:10 ) [37]
перефразируя анекдот:
- Считал я несколько битов с диска, подскажите, как мне вернуть их обратно?
- Вот из за таких козлов, как ты, на диске совсем битов не осталось.
Defunct © ( 2005-05-27 04:19 ) [38]
Приведу удобный, с моей точки зрения, объект для работы с битами:
TRegister = object
private
fValue : Cardinal;
fMax : Cardinal;
fCarry : Byte;
fWL : Byte;
public
procedure WHex( Value : Cardinal ); // Записать слово
procedure WBit( N, Bit: Byte); // Записать бит номер N (N Є 0..(WL-1), Bit Є )
function RBit(N:Byte):Byte; // Прочитать бит номер N (N Є 0..(WL-1) )
function RHex:Cardinal; // Прочитать слово
function Carry:Byte; // Перенос (автоматически сбрасывает при чтении)
function Parity:Byte; // Четность
constructor Init(WordLength:Byte); // Инициализация разрядности
destructor Done; // разрушение объекта, В Delphi необязательно вызывать
end;
constructor TRegister.Init(WordLength: Byte);
begin
if (WordLength > 0) and (WordLength begin
fWL := WordLength;
fMax := AMask[WordLength] - 1;
end
else
raise Exception.Create("Could not initialize register");
end;
function TRegister.Carry: Byte;
begin
Result := fCarry;
fCarry := 0
end;
function TRegister.Parity: Byte;
var
i : integer;
ActiveCount : integer;
begin
ActiveCount := 0;
for i := 0 to fWL - 1 do
if RBit(i)<>0 then
inc(ActiveCount);
Result := (ActiveCount and 1);
end;
function TRegister.RBit(N: Byte): Byte;
begin
if N < fWL then
Result := Byte((fValue and AMask[N]) <> 0 )
else
raise Exception.Create("index out of bound")
end;
function TRegister.RHex: Cardinal;
begin
Result := fValue
end;
procedure TRegister.WBit(N, Bit: Byte);
begin
if N < fWL then
begin
if Bit <> 0 then
fValue := fValue or AMask[N]
else
fValue := fValue and ZMask[n]
end
else
raise Exception.Create("index out of bound");
end;
procedure TRegister.WHex(Value: Cardinal);
begin
if Value > fMax then
begin
fValue := Value and fMax;
fCarry := 1
end
else
begin
fValue := Value;
fCarry := 0
end
end;
procedure Platform_Init;
var
i : integer;
A : Cardinal;
begin
for i := 0 to Platform_Type - 1 do
begin
A := 1 shl i;
AMask[i] := A;
ZMask[i] := not A
end
end;
end.
← →isasa © ( 2005-05-27 10:42 ) [39]
Касается дисковых операций.
Эсли абстрагироваться от всего, то
при одином обороте шпинделя (1/7200 сек) в буфере находится
содержимое одного цилиндра (1 трек х к-во поверхностей) хочеш ты того, или нет.
Вот и подумай, что быстрее, выковыривать оттуда биты, млм передать блок целиком,
и потом с ним разбираться побитово, побайтово, пословно.
Defunct © ( 2005-05-27 12:29 ) [40]
isasa © (27.05.05 10:42) [39]
Чтение с диска идет побитово.
Битовые цепочки еще вдобавок кодированы (RLL).
Объем буфера ограниченный (цилиндр туда не поместится).
По SATA данные передаются побитово
Mischa_M © ( 2005-11-24 01:50 ) [0]
Здраствуйте.
Подскажите пожалуйста каким образом можно считать файл по битам. Самое близкое к этому что у меня получается это считывание файла по байтам с помощью BlockRead(F, Buf, 1). Дальше я не знаю что делать. Помогите пожалуйста.
Зараннее благодарен.
Янис Прасол © ( 2005-11-24 02:03 ) [1]
> Подскажите пожалуйста каким образом можно считать файл по
> битам.
Никак.
> Дальше я не знаю что делать.
Разложить полученные байты на биты.
Германн © ( 2005-11-24 03:13 ) [2]
О! Второе пришествие. Совсем недавно было то же самое.
2 Mischa_M © (24.11.05 01:50)
Если сможешь, объясни задачу в целом. Простым языком. Т.е. по возможности без терминов "байт", "бит" etc.
Leonid Troyanovsky © ( 2005-11-24 09:54 ) [3]
> Mischa_M © (24.11.05 01:50)
> Подскажите пожалуйста каким образом можно считать файл по битам.
Сначала записать его по битам, потом считать.
--
Regards, LVT.
tesseract © ( 2005-11-24 10:39 ) [4]
> Помогите пожалуйста.
Сразу под названием конференции есть элемент ввода "поиск" и кнопка "найти". Этот вопрос обсуждался неоднакратно.
alex_*** © ( 2005-11-24 10:47 ) [5]
А ктоть отвечал зачем это нужно?
← →Amoeba © ( 2005-11-24 11:45 ) [6]
Если так приспичило, то можно следующим образом:
1. Отображаем файл в память
2. Теперь работаем с ним как с байтовым массивом, считывая нужный бит следующей ф-ией (взята из модуля QStrings):
Теперь про Пойск и кнопку Найти
Когда я набираю фразу "файл по битам" появляется пустое окно. И всё. Может я что то не правильно делаю.
Одним словом, всем СПАСИБО ОГРОМНОЕ за ответы :)
← →Anatoly Podgoretsky © ( 2005-11-24 23:16 ) [8]
Mischa_M © (24.11.05 01:50)
Никак и с память никак, минимальная единица байт
Anatoly Podgoretsky © ( 2005-11-24 23:18 ) [9]
Mischa_M © (24.11.05 23:14) [7]
Работай с байтами, а раз блок 64 бита, значит сразу по 8 байт
Германн © ( 2005-11-25 01:34 ) [15]
Лично я бы в данной ситуации определил бы следующие два типа:
TMyBits = (Bit0,Bit1,Bit2. Bit63);
TSetOfMyBits = Set of TMyBits;
Затем читал бы файл блоками по 8 байт в переменную типа TSetOfMyBits (или уже считанный файл разбирал бы этими же блоками копируя в такую же переменную).
Хотя если вспомнить
> Потом эта прога(скорее этот алгоритм) будет зашит в процессор.
я бы разрабатывал этот алгоритм с учетом системы команд конкретного микропроцессора.
← →Германн © ( 2005-11-25 01:35 ) [16]
> Mischa_M © (25.11.05 01:27) [14]
Удали пробел между ". html&file_i" и "d=app-bits"
← →Mischa_M © ( 2005-11-25 01:41 ) [17]
Германн, мне препод сказал что бы я сначала ето всё промоделировал на компе на примере wav файла. То есть нужно зашифровать wav файл пока. А голосовые данные уже потом на процессоре.
Но всё равно спасибо тебе за помощь :)
Германн © ( 2005-11-25 01:48 ) [18]
Вот! Наконец-то произнесено ключевое слово "препод". Так бы сразу и говорил.
> А голосовые данные уже потом на процессоре.
Уточни предмет препода. Если это "Микропроцессоры", то тебе придётся делать две разные работы. Одну на Паскале, вторую на МК.
← →Mischa_M © ( 2005-11-25 01:49 ) [19]
ЭТО МОЯ МАГИСТРСКАЯ РАБОТА :)))))))
← →Германн © ( 2005-11-25 02:02 ) [20]
Я же не просил кричать "Я САМЫЙ ВЕЛИКИЙ ВОЛШЕ. ". Пардон, это уже было в каком-то детском "кине".
← →Mischa_M © ( 2005-11-25 02:20 ) [21]
Германн
>Лично я бы в данной ситуации определил бы следующие два типа:
TMyBits = (Bit0,Bit1,Bit2. Bit63);
TSetOfMyBits = Set of TMyBits;
while not Eof(F) do
begin
BlockRead(F, Buf, 1);
А здесь мне как быть ?
end;
← →Mischa_M © ( 2005-11-25 02:24 ) [22]
Хотя в моём случае BlockRead(F, Buf, 8);
← →Германн © ( 2005-11-25 02:54 ) [23]
> Mischa_M © (25.11.05 02:20) [21]
>
> Германн
> >Лично я бы в данной ситуации определил бы следующие два
> типа:
> TMyBits = (Bit0,Bit1,Bit2. Bit63);
> TSetOfMyBits = Set of TMyBits;
>
> ТО есть так.
>
> while not Eof(F) do
> begin
> BlockRead(F, Buf, 1);
>
> А здесь мне как быть ?
>
> end;
>
> Mischa_M © (25.11.05 02:24) [22]
>
> Хотя в моём случае BlockRead(F, Buf, 8);
Это зависит от того, как ты объявил переменную F (File, File of TSetOfMyBits). И от того как ты прописал RESET(F. ).
← →alex_*** © ( 2005-11-25 09:37 ) [24]
почитай наконец про битовые операции - сдвиги, маски, вычитывай файл кусками, кратными 8 байт и обрабатывай их
← →evvcom © ( 2005-11-25 10:02 ) [25]
После зашития программы в микропроцессор (микроконтроллер) ты скорее всего уже не будешь читать данные с диска ни битами, ни байтами, ни блоками. Они у тебя уже будут в памяти. Ну и читай ты блок целиком и считай, что этот блок как бы уже в памяти МП. Ты же моделируешь. И этого блочного чтения у тебя потом уже не будет. А дальнейший алгоритм действительно лучше разрабатывать с учетом типа будущего микроконтроллера. Причем написать можно и на паскале, но потом разобраться с получившимся ассемблерным кодом. Или программа для программирования микрочипов уже и паскаль понимает?
И даже микроконтроллер будет читать из своей памяти не битами, а байтами или даже группами байт (словами, двойными словами - зависит от разрядности процессора) в свои регистры, а уж потом можно анализировать определенные биты в регистрах.
LostDelpher ( 2005-11-25 11:33 ) [26]
а может такой код
считываешь байт в переменную MyBite
для каждого байта
проверка есть ли на
етсь ли бит на 1 - м месте
a:=MyBite and 00000001
на втором
a:=MyBite and 00000010
и т.д. естественно если a>0 значит там есть бит - если 0 - значит нет.
тебе это нужно ?
byte2str ( 2005-11-25 17:46 ) [27]
Перевод байтов в биты:
function byte2str(B:byte):string;
var i:byte;
begin
result:="";
for i:=0 to 7 do
begin
if (B and 128)=128 then result:=result+"1" else result:=result+"0";
B:=(B SHL 1);
end;
end;
Caption:=byte2str(4);
Anatoly Podgoretsky © ( 2005-11-25 18:57 ) [28]
Mischa_M © (25.11.05 02:20) [21]
По работе с файлами Паскаля, там же на моем сайте.
Германн © ( 2005-11-26 02:28 ) [29]
Автор сабжа, скорее всего, занят другими своими "хвостами", но
Прошу всех дезавуировать мой пост - Германн © (25.11.05 01:34) [15]. Он соответствует сабжу, но противоречит уоточнению задачи Mischa_M © (24.11.05 23:14) [7].
2 evvcom © (25.11.05 10:02) [25]
>После зашития программы в микропроцессор (микроконтроллер) ты скорее >всего уже не будешь читать данные с диска ни битами, ни байтами, ни >блоками. Они у тебя уже будут в памяти.
С учетом задачи, они всё таки будут как-то вводится в память. Конечно не битами, но, имхо, блоками.
>Или программа для программирования микрочипов уже и паскаль понимает?
"Программа для программирования" ничего, кроме двоичных данных не принимает, но компилляторы с Паскаля есть. И я уже тут постил "гневные высказывания" об одном из них. Хотя компилляторы С для 51-процессоров есть вполне приемлемые, если не учитывать оптимальность.
> И даже микроконтроллер будет читать из своей памяти не битами, а >байтами или даже группами байт (словами, двойными словами - зависит от >разрядности процессора) в свои регистры, а уж потом можно анализировать >определенные биты в регистрах.
Извини Слав, но тут ты не совсем прав. Термин "битовый процессор" существует не просто как аллегория. Он есть наяву.
Но вот с учётом данной задачи нужно работать именно с байтами. Имхо, я не знаю процессоров, которые допускают "косвенную адресацию" битов. :(
2 evvcom ©
Не прими вышеизложенное как упрёк в твой адрес. Просто ты помог мне уточнить ответ на задачу.
SergProger © ( 2005-11-26 02:48 ) [30]
Вот две функции:
function DecToBin(Dec: Byte): Integer;
begin
Result:=(Dec div 1 mod 2)+(Dec div 2 mod 2)*10+(Dec div 4 mod 2)*100
+(Dec div 8 mod 2)*1000+(Dec div 16 mod 2)*10000
+(Dec div 32 mod 2)*100000+(Dec div 64 mod 2)*1000000
+(Dec div 128 mod 2)*10000000;
end;
DecToBin переводит байт в двоичную запись, Bit извлекает из двоичной записи байт по его индексу.
Резюме
В этом уроке я показал вам шаги для того, чтобы разобрать и проанализировать музыку.
Навык не появится через один или два дня. Планируйте в долгосрочной перспективе.
Данный урок посвящён битовым операциям (операциям с битами, битовой математике, bitmath). Из него вы узнаете, как оперировать с битами – элементарными ячейками памяти микроконтроллера.
Данная тема является одной из самых сложных для понимания в рамках данного курса уроков, так что давайте разберёмся, зачем вообще нужно уметь работать с битами:
- Гибкая и быстрая работа напрямую с регистрами микроконтроллера.
- Работа напрямую с внешними микросхемами (датчики и прочее), управление которыми состоит из записи и чтения регистров, данные в которых могут быть запакованы в байты самым причудливым образом.
- Более эффективное хранение данных: упаковка нескольких значений в одну переменную и распаковка обратно.
- Создание символов и другой информации для матричных дисплеев.
- Максимально быстрые вычисления.
- Разбор чужого кода.
Данный урок основан на оригинальном уроке по битовым операциям от Arduino, можете почитать его здесь – там всё описано чуть более подробно.
Пример сжатия 1
Таким же способом можно паковать любые другие данные других размеров для удобного хранения или сжатия. Как пример – моя библиотека microLED, в которой используется следующий алгоритм: изначально необходимо хранить в памяти три цвета для каждого светодиода, каждый цвет имеет глубину 8 бит, т.е. в общей сложности тратится 3 байта на один светодиод RRRRRRRR GGGGGGGG BBBBBBBB. Для экономии места и удобства хранения можно сжать эти три байта в два (тип данных int ), потеряв несколько оттенков результирующего цвета. Например вот так: RRRRRGGG GGGBBBBB. Сожмём и упакуем: есть три переменные каждого цвета, r , g , b :
Таким образом мы отбросили у красного и синего младшие (правые) биты, в этом и заключается сжатие. Чем больше битов отброшено – тем менее точно получится “разжать” число. Например сжимали число 0b10101010 (170 в десятичной) на три бита, при сжатии получили 0b10101000, т.е. потеряли три младших бита, и в десятичной уже получится 168. Для упаковки используется битовый сдвиг и маска, таким образом мы берём первые пять битов красного, шесть зелёного и пять синего, и задвигаем на нужные места в результирующей 16-битной переменной. Всё, цвет сжат и его можно хранить. Для распаковки используется обратная операция: выбираем при помощи маски нужные биты и сдвигаем их обратно в байт:
Таким образом можно сжимать, разжимать и просто хранить маленькие данные в стандартных типах данных.
Экономия памяти
При помощи битовых операций можно экономить немного памяти, пакуя данные в блоки. Например, переменная типа boolean занимает в памяти 8 бит, хотя принимает только 0 и 1. В один байт можно запаковать 8 логических переменных, например вот так:
Хороший трюк, может пригодиться! Я сделал удобную библиотеку для хранения битовых флагов, документация и примеры есть здесь.
YouTube видео
Обычно я ищу высококачественное музыкальное видео на YouTube, а затем его повторяю для анализа и программирования MIDI. Вы также можете скачать эти видео с некоторых веб-сайтов.
Как это сделать
Битовое исключающее ИЛИ
Битовая операция исключающее ИЛИ (XOR) выполняется оператором ^ или xor и делает следующее:
Данная операция обычно используется для инвертирования состояния отдельного бита:
То есть мы взяли бит №7 в байте 0b11001100 и перевернули его в 0, получилось 0b01001100, остальные биты не трогали.
8. Микширование
Я рекомендую слушать эти элементы во время микширования:
Битовые операции
Mixed in Key и Rapid Evolution
Это программы, которые показывают темп и тональность.
В течение долгого времени я использовал Rapid Evolution. Затем в декабре прошлого года я купил последнюю версию Mixed in Key.
Очень рекомендую. Это быстрое и точное программное обеспечение, которое легко использовать.
Я могу анализировать гамму и темп с помощью Mixed In Key
Битовый сдвиг
Битовый сдвиг – очень мощный оператор, позволяет буквально “двигать” биты в байте вправо и влево при помощи операторов >> и >= и теряются.
Битовый сдвиг делает не что иное, как умножает или делит байт на 2 в степени. Да, это операция деления, выполняющаяся за один такт процессора! К этому мы ещё вернёмся ниже. Посмотрите на работу оператора сдвига и сравните её с макросами bit() и _BV() :
Возведение двойки в степень! Важный момент: при сдвиге дальше, чем на 15, нужно преобразовывать тип данных, например в ul: 1
MIDI-клавиатура
Вам не нужно играть на пианино. Достаточно записать мелодию из четырех нот на MIDI-клавиатуре.
Это может занять от пяти до 50 минут в зависимости от данной музыки, ваших навыков и музыкального интеллекта.
Если у вас нет MIDI-клавиатуры, приобретите хотя бы двухоктавную версию. Этого достаточно для мелодий, баса и коротких аккордовых последовательностей.
Инструменты
Готовые MIDI-файлы
Ищите в Интернете бесплатные или платные MIDI-файлы. Используя их вы можете быстро создавать вдохновляющую музыку, бутлег или ремикс.
Двоичная система
В цифровом мире, к которому относится также микроконтроллер, информация хранится, преобразуется и передается в цифровом виде, то есть в виде нулей и единиц. Соответственно элементарная ячейка памяти, которая может запомнить 0 или 1 , называется бит (bit).
Двоичная | Десятичная |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
… | … |
10000 | 16 |
Здесь также нужно увидеть важность степени двойки – на ней в битовых операциях завязано абсолютно всё. Давайте посмотрим на первые 8 степеней двойки в разных системах счисления:
2 в степени | DEC | BIN |
0 | 1 | 0b00000001 |
1 | 2 | 0b00000010 |
2 | 4 | 0b00000100 |
3 | 8 | 0b00001000 |
4 | 16 | 0b00010000 |
5 | 32 | 0b00100000 |
6 | 64 | 0b01000000 |
7 | 128 | 0b10000000 |
Таким образом, степень двойки явно “указывает” на номер бита в байте, считая справа налево (примечание: в других архитектурах может быть иначе). Напомню, что абсолютно неважно, в какой системе исчисления вы работаете – микроконтроллеру всё равно и он во всём видит единицы и нули. Если мы “включим” все биты в байте, то получится число 0b11111111 в двоичной системе или 255 в десятичной.
Если “сложить” полный байт в десятичном представлении каждого бита: 128+64+32+16+8+4+2+1 – получится 255. Нетрудно догадаться, что число 0b11000000 равно 128+64, то есть 192. Именно таким образом и получается весь диапазон от 0 до 255, который умещается в один байт. Если взять два байта – будет всё то же самое, просто ячеек будет 16, то же самое для 4 байт – 32 ячейки с единицами и нулями, каждая имеет свой номер согласно степени двойки.
Битовое ИЛИ
ИЛИ (OR), оно же “логическое сложение”, выполняется оператором | или or и возвращает следующее:
Основное применение операции ИЛИ – установка бита в байте:
Также можно использовать составной оператор |=
Вы уже поняли, что указывать на нужные биты можно любым удобным способом: в бинарном виде (0b00000001 – нулевой бит), в десятичном виде (16 – четвёртый бит) или при помощи макросов bit() или _BV() ( bit(7) даёт 128 или 0b10000000, _BV(7) делает то же самое)
6. Мелодии
Пример сжатия 2
Давайте ещё пример: нужно максимально компактно хранить несколько чисел в диапазоне от 0 до 3, то есть в бинарном представлении это 0b00 , 0b01 , 0b10 и 0b11 . Видим, что в один байт можно запихнуть 4 таких числа (максимальное занимает два бита). Запихиваем:
Как и в примере со светодиодами, мы просто брали нужные биты ( в этом случае младшие два, 0b11 ) и сдвигали их на нужное расстояние. Для распаковки делаем в обратном порядке:
И получим обратно наши байты. Также маску можно заменить на более удобную для работы запись, задвинув 0b11 на нужное расстояние:
Теперь, проследив закономерность, можно сделать для себя функцию или макрос чтения пакета:
Где x это пакет, а y – порядковый номер запакованного значения. Выведем посмотрим:
B) Структура
Вы всегда должны начинать с этих вещей, чтобы установить основу музыки и настроения.
- Темп и ритм
- Музыкальная гамма
- Аккордовая последовательность
7. Звуковой дизайн
- Настроение
- Тип звука
- Синтез
- Сэмплирование
- Синтезаторы
- Психо-акустика
Анализ
Чтобы проанализировать, я поставил трек на повтор. Я активно слушаю инструменты для их идентификации. Техническая часть - это дизайн звука и микширование.
Если я не пойму или не услышу что-то, то я повторяю процесс прослушивания.
С каждым активным прослушиванием я нахожу все больше и больше элементов.
Быстрые вычисления
Как я уже говорил, битовые операции – самые быстрые. Если требуется максимальная скорость вычислений – их можно оптимизировать и подогнать под “степени двойки”, но иногда компилятор делает это сам, подробнее смотри в уроке про оптимизацию кода. Рассмотрим базовые операции:
- Деление на 2^n – сдвиг вправо на n . Например, val / 8 можно записать как val >> 3 . Компилятор не оптимизирует деление самостоятельно, что позволяет ускорить данную операцию приблизительно в 15 раз при ручной оптимизации.
- Умножение на 2^n – сдвиг влево на n . Например, val * 8 можно записать как val оптимизирует умножение самостоятельно, поэтому в ручной оптимизации нет смысла. Но можно встретить в чужих исходниках.
- Остаток от деления на 2^n – битовая маска на n младших битов. Например, val % 8 можно записать как val & 0b111 . Компилятор оптимизирует такие операции самостоятельно, поэтому в ручной оптимизации нет смысла. Но можно встретить в чужих исходниках.
Инструмент фортепианного типа
Для программирования MIDI я использую звук фортепьяно из любого плагина или сэмплера моей DAW (Ableton Sampler или Simpler).
3. Аккордовая последовательность
Часто аккорды одинаковой длительности написаны для таких периодов:
Во многих музыкальных произведениях есть всего 4-8 аккордов, поэтому вам не нужно слишком много работать, чтобы понять их.
В Ableton я могу быстро протестировать несколько аккордовых идей
Типы популярных созвучий и аккордов:
- Дихорд (2 ноты)
- Трихорд (3 ноты)
- Тетрахорд (4 ноты)
Примеры наиболее часто используемых аккордовых последовательностей:
До - Соль - До - Соль | I - V - I - V |
До - Соль - Фа - Соль | I - V - IV - V |
Ре – До – Соль | V – IV – I |
Соль – До – Ре – До | I – IV – V – IV |
Соль – Ми-минор – До – Ре | I – vi – IV – V |
Ми-минор – Ре – До – Си | VI – V – IV – III |
Обычно бас использует основной тон аккорда. Иногда немного меняется.
Первая и пятая ступени (I и V) являются наиболее важными нотами, когда речь идет об устойчивости в гамме.
Битовое И
И (AND), оно же “логическое умножение”, выполняется оператором & или and и возвращает следующее:
Основное применение операции И – битовая маска. Позволяет “взять” из байта только указанные биты:
То есть при помощи & мы взяли из байта 0b11001100 только биты 10000111, а именно – 0b11001100, и получили 0b10000100 Также можно использовать составной оператор &=
Макросы для манипуляций с битами
В библиотеке Arduino.h есть несколько удобных макросов, которые позволяют включать и выключать биты в байте:
Макрос | Действие |
bitRead(value, bit) | Читает бит под номером bit в числе value |
bitSet(value, bit) | Включает (ставит 1) бит под номером bit в числе value |
bitClear(value, bit) | Выключает (ставит 0) бит под номером bit в числе value |
bitWrite(value, bit, bitvalue) | Ставит бит под номером bit в состояние bitvalue (0 или 1) в числе value |
bit(bit) | Возвращает 2 в степени bit |
Другие встроенные макросы | |
_BV(bit) | Возвращает 2 в степени bit |
bit_is_set(value, bit) | Проверка на включенность (1) бита bit в числе value |
bit_is_clear(value, bit) | Проверка на выключенность (0) бита bit в числе value |
Этого уже достаточно для полноценной работы с регистрами. Так как это именно макросы, работают они максимально быстро и ничуть не хуже написанных вручную элементарных битовых операций. Чуть ниже мы разберём содержимое этих макросов и увидим, как они работают, а пока познакомимся с элементарными логическими операциями.
Прослушивание
Слушайте музыку с активным мышлением. Если вы не слышите детали, тогда тренируйте свои уши.
С саморазвитием вы услышите все элементы, но вам нужно время для этого. Одного или двух дней недостаточно; Думаю - это длительный процесс.
Раньше у меня был абсолютный музыкальный слух, который я развивал в течение нескольких лет. Если вы сознательно практикуетесь, вы можете сократить время на порядок.
1. Темп и ритм
Вы можете найти название темпа в этой таблице
Самый распространенный тактовый размер - 4/4. В большинстве музыки используется этот размер.
Читайте также: