Перейти к публикации
Форум - ComputerCraft
Fingercomp

smap — плеер музыки в MC

Рекомендованные сообщения

В активной разработке (а как же иначе, если на кону стоит эта штука) сейчас находится такая библиотека, как smap — акроним от simple minecraft audio player. Взялся я за такую тему, в которой я почти полностью нуб. Какие-то чертовски непонятные спецификации на миллионы строк для одного только формата, волны морские звуковые, которые как-то надо играть нотами.

Что есть?

  • Поддержка computer.beep().
  • Поддержка железных нотноблоков из Computronics (одного хватит).
  • Поддержка Beep Card из Computronics (однако, не тестил).
  • MIDI — ужасно кривая реализация, так как был скопирован большой объём кода из программы Sangar, а затем кое-как переделан, не имея понятися о работе кодека.
  • NBS — использовал программу TxN для того, чтобы не копаться в очень скудной спецификации формата... на C#... Ну там всё довольно просто, к тому же даже умудрился прикрутить загрузку файла во время игры,

Что надо? Хороший вопрос, ибо единственный ответ — это цель проекта. "Возможность играть многие форматы аудио в Minecraft на разных устройствах". Так что тех, кто разбирается в кодеках, музыке и тому прочем, прошу помочь мне с этим плеером несчастным. Парсинг файлов музыкальных, куски кода на Луа, ссылки на реализации чтения форматов на языках программирования иди даже Pull Request'ы (O.o).

 

Сама библиотека лежит здесь: https://github.com/OpenPrograms/Fingercomp-Programs/tree/master/smap/smap, которую можно скачать на компьютер OC с помощью OPPM: oppm install smap.

 

Пример использования библиотеки:

-- Подключаем библиотеку
local smap = require("smap")
-- Загружаем аудио-файл
local music = smap.load("/home/music/NyanCat.nbs", "nbs")
-- Создаём объект выходного устройства (inoteblock — железный нотный блок)
local outputDevice = smap.modules.output.inoteblock.new()
-- Подключаем устройство
music:connect(outputDevice)
-- Играем музыку до конца
print(music:play(math.huge))

И хотя обычно темы о помощи вообще никакого резонанса не делали — неинтересно другим, — я всё-таки надеюсь на помощь.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В нотах разобраться не сложно. Главное чтение файла нормальное сделать. Да и формат взять нормальный, где поддерживаются ноты разной продолжительности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да ноты-то я знаю, сам на пьянине играл. Бемоледиезы в ту же топку.

Есть внутренний формат, который хранит ноты, а не волну. Точней сказать, аккорды — массив массивов с заданной продолжительностью, тиком, частотой и инструментом (пока только пять, сменить легко).

 

Теперь нужны внешние — какой-нибудь простой для декодинга и понимания не помешал бы. Ну и более-менее популярный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Есть внутренний формат, который хранит ноты

Ну так есть стандартная библиотека note которая если надо может переводить ноты в длину волны. Да и посмотрев на это библиотеку (по какой формуле происходит конвертация) можно и самому такую функцию написать. Не особо сложно.

 

 

 

Точней сказать, аккорды

Что за формат что хранит в себе аккорды вместо отдельных нот?

 

 

 

Теперь нужны внешние — какой-нибудь простой для декодинга и понимания не помешал бы.

То есть нужен вымышленный формат для конвертации произведения с нужного формата в своё собственный? А потом со своего формата будет производится игра? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну так есть стандартная библиотека note которая если надо может переводить ноты в длину волны. Да и посмотрев на это библиотеку (по какой формуле происходит конвертация) можно и самому такую функцию написать. Не особо сложно.

"Спасибо", а то я сооооовсеем не знал о ней. Ага.

 

 

Что за формат что хранит в себе аккорды вместо отдельных нот?

Есть трек, он хранит буферы, буферы хранят акккорды, которые хранят ноты.

 

 

То есть нужен вымышленный формат для конвертации произведения с нужного формата в своё собственный? А потом со своего формата будет производится игра?

А почему "вымышленный"? Не на одних MP3 и MIDI мир сошёлся.

Не вижу ничего плохого в своём формате — а иначе как абсолютные разные файлы проигрывать?

Я так понял, что ты вообще моё сообщение не читал нормально.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Только что буквально починили midi — звук НЕМНОООООГО, но похож на тот, что нужен. Правда, из-за переносов октав вверх/вниз, непоятных инструментов и сложных нот, звук может (и будет) отличаться от оригинального.

 

Сейчас надо починить игру в фоне для всяких игрушек, например, ну и ещё прикрутить какой-нибудь формат файлов музыкальных, кроме миди и nbs.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не подгружается через require на том месте где он ищет фаил init.lua там есть только папка init.lua а в ней уже сам init.lua :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не подгружается через require на том месте где он ищет фаил init.lua там есть только папка init.lua а в ней уже сам init.lua :)

Ох ё. :facepalm:

Срочно обновил список — пропишите oppm uninstall smap и oppm install smap.

>_>

Ну и раз я пишу пост, о работе. Базовые команды:

  • smap.load(path: string, format: string) — загрузить файл по данному пути данного формата ("midi" / "nbs"). Возвращает объект Music, которые далее будет переменной music.
  • smap.device(name: string) — получить экземпляр устройства ("inoteblock" ­— железный нотный блок, "pcspkr"computer.beep(), "beep" — Beep Card).
  • music:connect(device: Device) — подключить экземпляр устройства.
  • music:play(ticks: number): [nil, reason] — проиграть мелодию заданное количество тиков. Можно поставить math.huge.
  • music:seek(pos: number) — переключить буфер в треке и сбросить позицию буфера до 1. Например, music:seek(1).
  • music:getPos(): number — возвратить текущий буфер.
  • music:getLength(): number — получить длину трека (данную функцию следует вызывать после загрузки всех буферов).
  • music:close() — освободить память.
Изменено пользователем Fingercomp
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Ох ё. :facepalm:

Срочно обновил список — пропишите oppm uninstall smap и oppm install smap.

>_>

 

 

А Гуишка будет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А Гуишка будет ?

Ну должна быть, вообще.

Вот только лень возиться с гуишками опять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Консольная утилитка... smap (да у меня самые оригинальные названия!)

Собственно, более-менее человеческий интерфейс ко смапу. Не самый доработанный, ну и фиг с ним пока что.

Включена в пакет: oppm install smap или oppm update smap.

 

  1. Качаем мюзикальный файл NBS/MIDI.
  2. Устанавливаем smap.
  3. Пишем smap --d=<устройство> <путь> <формат>, где <устройство> — одно из inoteblock, pcspkr, beep (см. посты выше), <путь> — путь к файлу и <формат> — формат файла (nbs или midi).
  4. Слушаем музыку! :rap:
  5. Для выхода вам надо попытаться нажать Control и С в нужное время. Или дослушать до конца. Или перезагрузить комп.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Продолжаю кодить свой любимый смапик. В обновлении завезли:

  • Трелло-доску: https://trello.com/b/PYyrj3dP/smap
  • Совместимость с потоками. Для этого вторым аргументом передайте "allow" (для разрешения слипа) или "force" (для принудительного слипа, не будет работать на треках с темпом > 20 tps).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теперь в библиотеке появилась новая функция: smap.guessFormat(path: string), которая может примерно определять формат файла для smap.load.

А ещё NBS треки грузятся теперь полностью. Это чтобы не скакала длительность в плеере.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С midi отказывается работать, прога от Сангара все воспроизводит, а тут init.lua ругается на {number, nil, number}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С midi отказывается работать, прога от Сангара все воспроизводит, а тут init.lua ругается на {number, nil, number}

Можно миди-файлик для тестов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

например это работает нормально, а

это крашит

Странно, один из ивентов не содержал длительность ноты O.o

Обновил программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обновил программу. Кое-как сделал оптимизацию памяти (причём значительную), ну и там ещё задержки улучшил.

Трек Дуба теперь играется нормально.

 

В плеер, которым я настоятельно рекомендую пользоваться для проигрывания треков, кроме задержек ещё добавил паузу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×