Fingercomp 4 411 Опубликовано: 25 апреля, 2016 В активной разработке (а как же иначе, если на кону стоит эта штука) сейчас находится такая библиотека, как 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)) И хотя обычно темы о помощи вообще никакого резонанса не делали — неинтересно другим, — я всё-таки надеюсь на помощь. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 25 апреля, 2016 В нотах разобраться не сложно. Главное чтение файла нормальное сделать. Да и формат взять нормальный, где поддерживаются ноты разной продолжительности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 25 апреля, 2016 Да ноты-то я знаю, сам на пьянине играл. Бемоледиезы в ту же топку. Есть внутренний формат, который хранит ноты, а не волну. Точней сказать, аккорды — массив массивов с заданной продолжительностью, тиком, частотой и инструментом (пока только пять, сменить легко). Теперь нужны внешние — какой-нибудь простой для декодинга и понимания не помешал бы. Ну и более-менее популярный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 25 апреля, 2016 Есть внутренний формат, который хранит ноты Ну так есть стандартная библиотека note которая если надо может переводить ноты в длину волны. Да и посмотрев на это библиотеку (по какой формуле происходит конвертация) можно и самому такую функцию написать. Не особо сложно. Точней сказать, аккорды Что за формат что хранит в себе аккорды вместо отдельных нот? Теперь нужны внешние — какой-нибудь простой для декодинга и понимания не помешал бы. То есть нужен вымышленный формат для конвертации произведения с нужного формата в своё собственный? А потом со своего формата будет производится игра? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 25 апреля, 2016 Ну так есть стандартная библиотека note которая если надо может переводить ноты в длину волны. Да и посмотрев на это библиотеку (по какой формуле происходит конвертация) можно и самому такую функцию написать. Не особо сложно. "Спасибо", а то я сооооовсеем не знал о ней. Ага. Что за формат что хранит в себе аккорды вместо отдельных нот? Есть трек, он хранит буферы, буферы хранят акккорды, которые хранят ноты. То есть нужен вымышленный формат для конвертации произведения с нужного формата в своё собственный? А потом со своего формата будет производится игра? А почему "вымышленный"? Не на одних MP3 и MIDI мир сошёлся. Не вижу ничего плохого в своём формате — а иначе как абсолютные разные файлы проигрывать? Я так понял, что ты вообще моё сообщение не читал нормально. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 25 апреля, 2016 Только что буквально починили midi — звук НЕМНОООООГО, но похож на тот, что нужен. Правда, из-за переносов октав вверх/вниз, непоятных инструментов и сложных нот, звук может (и будет) отличаться от оригинального. Сейчас надо починить игру в фоне для всяких игрушек, например, ну и ещё прикрутить какой-нибудь формат файлов музыкальных, кроме миди и nbs. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
FluttyProger 84 Опубликовано: 26 апреля, 2016 не подгружается через require на том месте где он ищет фаил init.lua там есть только папка init.lua а в ней уже сам init.lua Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 26 апреля, 2016 (изменено) не подгружается через require на том месте где он ищет фаил init.lua там есть только папка init.lua а в ней уже сам init.lua Ох ё. Срочно обновил список — пропишите 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() — освободить память. Изменено 26 апреля, 2016 пользователем Fingercomp 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 26 апреля, 2016 Ох ё. Срочно обновил список — пропишите oppm uninstall smap и oppm install smap. >_> А Гуишка будет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 26 апреля, 2016 А Гуишка будет ? Ну должна быть, вообще. Вот только лень возиться с гуишками опять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 26 апреля, 2016 Консольная утилитка... smap (да у меня самые оригинальные названия!) Собственно, более-менее человеческий интерфейс ко смапу. Не самый доработанный, ну и фиг с ним пока что. Включена в пакет: oppm install smap или oppm update smap. Качаем мюзикальный файл NBS/MIDI. Устанавливаем smap. Пишем smap --d=<устройство> <путь> <формат>, где <устройство> — одно из inoteblock, pcspkr, beep (см. посты выше), <путь> — путь к файлу и <формат> — формат файла (nbs или midi). Слушаем музыку! Для выхода вам надо попытаться нажать Control и С в нужное время. Или дослушать до конца. Или перезагрузить комп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 28 апреля, 2016 Продолжаю кодить свой любимый смапик. В обновлении завезли: Трелло-доску: https://trello.com/b/PYyrj3dP/smap Совместимость с потоками. Для этого вторым аргументом передайте "allow" (для разрешения слипа) или "force" (для принудительного слипа, не будет работать на треках с темпом > 20 tps). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 30 апреля, 2016 Теперь в библиотеке появилась новая функция: smap.guessFormat(path: string), которая может примерно определять формат файла для smap.load. А ещё NBS треки грузятся теперь полностью. Это чтобы не скакала длительность в плеере. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 751 Опубликовано: 30 апреля, 2016 С midi отказывается работать, прога от Сангара все воспроизводит, а тут init.lua ругается на {number, nil, number} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 30 апреля, 2016 С midi отказывается работать, прога от Сангара все воспроизводит, а тут init.lua ругается на {number, nil, number} Можно миди-файлик для тестов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 751 Опубликовано: 30 апреля, 2016 например это работает нормально, а это крашит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 30 апреля, 2016 например это работает нормально, а это крашит Странно, один из ивентов не содержал длительность ноты O.o Обновил программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp Автор темы 4 411 Опубликовано: 1 мая, 2016 Обновил программу. Кое-как сделал оптимизацию памяти (причём значительную), ну и там ещё задержки улучшил. Трек Дуба теперь играется нормально. В плеер, которым я настоятельно рекомендую пользоваться для проигрывания треков, кроме задержек ещё добавил паузу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах