Skip to content

Commit

Permalink
translate comments and bugfixes
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxAlyokhin committed Sep 11, 2023
1 parent bbd5e16 commit dfd08d5
Show file tree
Hide file tree
Showing 11 changed files with 168 additions and 98 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

_Binary file interpreter for audio synthesis_

[![Uptime Robot status](https://img.shields.io/uptimerobot/status/m795264551-bb4c959b31b6ff94b02f9545)](https://bs.stranno.su) [![Uptime Robot status](https://img.shields.io/uptimerobot/ratio/m795264551-bb4c959b31b6ff94b02f9545)](https://bs.stranno.su)

**Demo**: https://bs.stranno.su

![](https://store.stranno.su/bs/design.png)

_<a href="README_RU.md">Эта страница есть также на русском</a>_

All data on any computer or smartphone is in the form of files. The contents of these files are ultimately just zeros and ones. And these zeros and ones are basically all the same, so we need an interpreter to extract meaning from these texts. Basically, the file format (.mp3, .docx, etc.) is just a pointer to which interpreter we need to pass the text in order to extract meaning from it.
Expand Down
53 changes: 36 additions & 17 deletions README_RU.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

_Интерпретатор двоичных файлов для аудио-синтеза_

[![Uptime Robot status](https://img.shields.io/uptimerobot/status/m795264551-bb4c959b31b6ff94b02f9545)](https://bs.stranno.su) [![Uptime Robot status](https://img.shields.io/uptimerobot/ratio/m795264551-bb4c959b31b6ff94b02f9545)](https://bs.stranno.su)

**Демо**: https://bs.stranno.su

![](https://store.stranno.su/bs/design.png)

Все данные на любом компьютере или смартфоне представлены в виде файлов. Содержанием этих файлов в конечном итоге являются просто нули и единицы. И эти нули и единицы, в общем-то, все одинаковые, поэтому нам нужен интерпретатор, для того чтобы извлечь смысл из этих текстов. По сути, формат файла (.mp3, .docx и т.д.) это просто указатель, какому интерпретатору надо передать текст, чтобы из него извлечь смысл.

Но что, если формат файла и интерпретатор не совпадают? Что касается музыкальных экспериментов, то ранее были, например, попытки "воспроизвести" текстовый или иной файл через аудио-редактор, что ожидаемо рождало в результате в основном глитч и нойз; это может быть интересно больше с концептуальной, чем с музыкальной точки зрения.
Expand All @@ -22,7 +26,8 @@ _Интерпретатор двоичных файлов для аудио-си
3. На уровне всей системы мы задаём глобальные параметры:

- скорость интерпретации
- музыкальный строй (или его отсутствие), диапазон нот/частот
- наличие случайной величины разброса скорости интерпретации
- музыкальный строй (или его отсутствие), диапазон нот/частот; по этому диапазону равномерно сопоставляются частоты по 256 или 65 536 возможным комбинациям нулей и единиц
- зацикленность воспроизведения
- режим MIDI
- плавный или резкий переход между командами
Expand All @@ -34,27 +39,19 @@ _Интерпретатор двоичных файлов для аудио-си

6. Если дошли до конца файла, прекращаем исполнение, либо начинаем заново

## Запуск локально и сборка проекта

### Просто скопировать приложение

Всё необходимое для работы системы заложено в единственный `.html` файл, который можно скачать в папке `dist`, либо просто перейти на https://bs.strannо.su и, нажав правую кнопку мыши, в меню выбрать Сохранить как.
## MIDI

### Собрать билд локально для доработки кода
При включении MIDI-режима автоматически выбирается первый попавшийся порт из доступных и его первый канал. Далее последовательно при чтении посылается сигнал noteOn, через время Reading speed посылается сигнал noteOff. В Continuous режиме после каждого noteOn посылается Pitch сигнал, чтобы попасть в нужную частоту.

Tech stack: Vue3 + Pinia + Vite.
MIDI-сообщения могут посылаться:

1. Скачать и установить LTS версию Node.js
2. Скачать код напрямую с Github, либо через `git clone`
3. В папке с проектом в терминале выполнить:
- в соседние вкладки и окна браузеров, если они слушают MIDI (например, в веб-аналог [DX7](http://mmontag.github.io/dx7-synth-js))
- в DAW и прочие приложения, где есть виртуальные синтезаторы (то есть BS может управлять, например, синтезатором в Ableton)
- во внешние устройства, поддерживающие MIDI и подключённые к компьютеру

```bash
npm i
npm run dev # development-сборка
npm run build # production-сборка, генерирует index.html со всем необходимым
```
> **Note**: После любых манипуляций в MIDI-портами (подключение/отключение/переподключение) необходимо полностью перезапустить браузер, закрыв все окна браузера если их несколько
Для тестов MIDI можно пользоваться этим ресурсом https://studiocode.dev/midi-monitor/
> **Note**: MIDI-сообщения генерируются только на десктопе
## Особенности интерфейса

Expand All @@ -76,3 +73,25 @@ npm run build # production-сборка, генерирует index.html со в
- Random time gap - добавление случайной величины времени до следующего звука в пределах параметра Reading speed. Делает звук менее "роботизированным", так как расстояние до каждого звука немного отличается и это добавляет больше "живости" игре

- Commands range - позволяет играть не весь файл, а его определённую часть

## Запуск локально и сборка проекта

### Просто скопировать приложение

Всё необходимое для работы системы заложено в единственный `.html` файл, который можно скачать в папке `dist`, либо просто перейти на https://bs.strannо.su и, нажав правую кнопку мыши, в меню выбрать Сохранить как.

### Собрать билд локально для доработки кода

Tech stack: Vue3 + Pinia + Vite.

1. Скачать и установить LTS версию Node.js
2. Скачать код напрямую с Github, либо через `git clone`
3. В папке с проектом в терминале выполнить:

```bash
npm i
npm run dev # development-сборка
npm run build # production-сборка, генерирует index.html со всем необходимым
```

Для тестов MIDI можно пользоваться этим ресурсом https://studiocode.dev/midi-monitor/
6 changes: 3 additions & 3 deletions dist/index.html

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions src/BinarySynth.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ const file = useFileStore()
<div>
<FileInput />
<ControlPanel />
<div class="about">
<a href="https://github.com/MaxAlyokhin/binary-synth" target="_blank" rel="noopener noreferrer">About and sources</a>
</div>
</div>
<Status />
</div>
Expand All @@ -37,5 +40,19 @@ const file = useFileStore()
opacity: 0;
position: fixed;
}
.about {
padding-top: 10px;
text-align: center;
a {
color: rgb(101 106 113);
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
}
</style>
14 changes: 7 additions & 7 deletions src/assets/js/getMIDINote.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@ function getNearbyValues(number, array) {
return [nearbyLess, nearbyOver]
}

// Вычисляет массив: номер ноты и, при непрерывном режиме, величину питча
// Calculates an array of: note number and, in continuous mode, pitch value
let frequency = null
let nearbyValues = null
let percent = null
let pitchValue = null

export function getMIDINote(byte, bitness, mode, coefficients, minimumFrequency, minimumNote) {
// Возвращается номер ноты + питч
// 1. Вычислить частоту
// 2. Найти ближайщую нижнюю ноту в массиве к этой частоте
// 3. Вычислить разницу между этой нотой и исходной частотой
// 4. Эту разницу перевести в величину питча
// Note number + pitch is returned
// 1. Calculate frequency
// 2. Find the nearest lower note in the array to this frequency
// 3. Calculate the difference between this note and the original frequency
// 4. Convert this difference into a pitch value
if (mode === 'continuous') {
// 1.
if (byte === 0) frequency = minimumFrequency
Expand All @@ -55,7 +55,7 @@ export function getMIDINote(byte, bitness, mode, coefficients, minimumFrequency,
}
}

// Возвращается номер ноты
// The note number returned
if (mode === 'tempered') {
if (bitness === '8') return [Math.floor(coefficients.tempered8 * byte) + minimumNote]
if (bitness === '16') return [Math.floor(coefficients.tempered16 * byte) + minimumNote]
Expand Down
6 changes: 3 additions & 3 deletions src/assets/js/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ export function getRandomNumber(min, max) {
}

/**
* Преобразовывает строки 'true' || 'false' в соответствующее булево значение
* @param {String} value - строка для преобразования
* @return {Boolean} Возвращает булево значение
* Converts 'true' || 'false' strings to the corresponding boolean value
* @param {String} value - conversion string
* @return {Boolean} Returns a boolean value
*/
export function getBooleanFromString(value) {
// prettier-ignore
Expand Down
Loading

0 comments on commit dfd08d5

Please sign in to comment.