Всем_привет_извеняюсь_за_большую_задержку_но_как_вы_можете_заметить_у_меня_сломался_пробел_и_это_досадно_надеюсь_мистери_скоро_опублекует_3_статью_а_пока_от_меня_4:
Сегодня я хочу вам поведать об музыке.
Теория:
К сожалению PGE поддерживает лиш 2 формата музыки: WAV и MP3, так что надо будет запастись аудио конвертерами. Каждый формат играет свою цель в вашей программе и имеет свои плюсы и минусы. WAV – преднозначен для звуковых эффектов (взрыв, выстрел, эмоции и так далее), в то время когда MP3 – фоновая музыка. Начну с того что MP3 может проигрывать одновременно только одну музыку, когда WAV может несколько. Что бы запустить MP3 нам достаточно прописать:
pge.mp3.play(“path”)
где path – путь к файлу (не забываем что прописывать полный путь не надо, а только от рабочего каталога). Но вот с WAV такое не прокатит. Вначале нам нужно создать объект, после чего мы сможем запустить его. Создадим же наш объект:
object = pge.wav.load(“path”)
где path – путь к файлу (не забываем что прописывать полный путь не надо, а только от рабочего каталога), а object – объект нашего WAV файла. После чего мы должны будем его воспроизвести:
pge.wav.play(object)
-- или
object:play()
где object – объект нашего WAV файла. Теперь на нашей PSP играет музыка формата WAV и MP3. Давайте что то с ними сделаем. Вначале остановим их:
-- WAV
pge.wav.stop(object)
-- или
object.stop()
-- MP3
pge.mp3.stop()
Думаю обеснять что здесь и где не обезательно. Как я раньше и говорил WAV может воспроизводится несколько раз, поэтому была придумана функция которая останавливает сразу все звуки:
pge.wav.stopall()
Главное не забывайте что если вы останавливаете музыку то при повторном запуске она будет начинатся заного, что бы этого избежать ее надо поставить на паузу. Вот с этого момента начинаются минусы. Дело в том что WAV не поддержует паузу, так что будем обходится только с MP3:
pge.mp3.pause()
Когда вызывается эта функция в первый раз то MP3 ставится на паузу, во второй раз воспроизводится с того места где мы его остановили, тут же всплывает еще одно но, если мы используем функцию:
pge.mp3.play()
то мы заного воспроизведем MP3, вместо того чтобы воспроизвестись с момента паузы. Теперь давайте проверим играет ли сейчас музыка:
-- WAV
playing = pge.wav.isplaying(object)
-- или
playing = object:isplaying()
-- MP3
playing = pge.mp3.isplaying()
где playing - boolean переменная, если она равняется true значит музыка проигруется, иначе она будет ровнятся false. Теперь давайте заставим музыку повторятся после оконачания:
-- WAV
pge.wav.loop(object)
-- или
object:loop()
-- MP3
pge.mp3.loop(true|false)
Как вы заметили в MP3 нам надо поставить true или false (повторятся или не повторятся), в то время когда в WAV этого делать не обязательно (хоть и можно), при вызове WAV просто возьмет противоположное значение, а то есть если стоит что бы не повторялось, тогда будет повторятся и наоборот. И наконец разберем последнюю команду, самую интересную как по мне - громкость. Каждый формат имеет свое преимущество с этой функцией. Для начала пропишем команду которая будет менять громкость нашей музыки:
-- WAV
pge.wav.volume(object, lvol, rvol)
-- или
object:loop(lvol, rvol)
-- MP3
pge.mp3.volume(vol)
Для начала разберем WAV. Как вы думаю догадались lvol и rvol - громкость левого и правого динамика, эти значения должны лежать в диапазоне от 0 до 100, где 0 это отсутствие звука. Значение rvol можно не писать, тогда оно будет по умолчанию ровняться lvol. Это преимущество дает возможность создавать 3-ех мерный звук, что очень полезно в играх. По умолчанию эти значения ровняются 50. Теперь что касается MP3. Как мы видем он не имеет возможность создавать 3-ех мерный звук, но зато имеет больший диапазон громкости (от 0 до 100000) что делает более удобным в настройке громкости под ваш вкус. По умолчанию громкость 32678.
Мое личное мнение:
Перед тем как мы перейдем к практике я немного хотел бы подчеркнуть, а то есть сказать свое слово в использовании обоих форматов. Начну я с MP3. Качество звука при проигрывании довольно не плохое, настройки все работают и в общем это довольно не плохой выбор, если вы хотите просто воспроизвести музыку. А вот WAV для музыки совсем не подходит. Во первых присутствует небольшое шипение, что сильно сказуеться качестве воспроизведения. Во вторых при проигрывании музыки настройки не вступают в силу, если они будут изменятся, к примеру если мы поставим громкость на максимум, проиграем ее и сразу поставим громкость на ноль, то все равно музыка будет играть на максимуме, лиш после остановки и заново воспроизведения музыки громкость будет нулевая. И в третьих если же громкость на нуле то из-за небольшого шипения все равно будет издаватся звук, хоть и не очень заметным, поэтому нам придется отслеживать этот момент, а то есть когда громкость стоит на нуле, нам придется любое воспроизведение запрещать. Столько минусов что заставляет задуматься, а стоит ли вообще использовать этот формат, мой ответ да, так как я раньше писал у него есть и некоторые плюсы, которые хоть и для музыки не нужны, но вот для звуков как раз то. Как я и писал WAV в отличае от MP3 может одновремено проигрывать несколько объектов, что значительное влияет, так как одновремено может происходит несколько действий, так же возможность создовать 3-ех мерный звук, что так же хорошо влияет на звук. Так что взяв все эти факторы, могу сказать с увериностью, MP3 было создано специально для фоновой музыки, в то время когда WAV чисто для звуков. И на последок скажу, что когда играет музыка, нивкоем случае не выходите системно (home), иначе зависнет ваша PSP.
Практика:
Напишем небольшую программу которая будет включать все функции которые мы сегодня выучили. Для начала напишем меню, с которого мы будем выбирать что нам воспроизвести: WAV или MP3.
white = pge.gfx.createcolor(255,255,255)
red = pge.gfx.createcolor(255,0,0)
arial = pge.font.load("arial.ttf",12, PGE_RAM)
arial_big = pge.font.load("arial.ttf",20, PGE_RAM)
menu = 1
while pge.running() do
pge.controls.update()
pge.gfx.startdrawing()
pge.gfx.clearscreen()
arial_big:activate()
if menu == 2 then
arial_big:printcenter(110,white,"WAV")
else
arial_big:printcenter(110,red,"WAV")
end
if menu == 1 then
arial_big:printcenter(150,white,"MP3")
else
arial_big:printcenter(150,red,"MP3")
end
if pge.controls.pressed (PGE_CTRL_CROSS) then
if menu == 1 then
dofile("scripts/wav.lua")
else
dofile("scripts/mp3.lua")
end
elseif pge.controls.pressed (PGE_CTRL_START) then
break
elseif pge.controls.pressed (PGE_CTRL_UP) then
menu = menu - 1
elseif pge.controls.pressed (PGE_CTRL_DOWN) then
menu = menu + 1
end
if menu == 3 then
menu = 1
elseif menu == 0 then
menu = 2
end
pge.gfx.enddrawing()
pge.gfx.swapbuffers()
end
Задерживатся на обесняния думаю не стоит, так как все что тут написано не по нашей теме, единственое на что я остановлю внимание, так это на том что при выборе одной из категории мы переходим к одному из двух файлов, которые находятся в папке "scripts". Теперь давайте создадим их: "mp3.lua" и "wav.lua". Для начала приступим к написанию "mp3.lua". Перед написанием давайте добавим в наш робочий каталог хотя бы пару MP3 файлов, я же их поместил в папку "music" и назвал "1.mp3" и "2.mp3", что бы легче их можно было использовать. Теперь приступим к самому коду. Для начала пропишем все переменные:
vol = 32678 -- громкость звука
mus = 1 -- какой трек сейчас играет
loop = false -- повтор музыки
Теперь приготовим цикл:
while pge.running() do
pge.controls.update()
pge.gfx.startdrawing()
pge.gfx.clearscreen()
-- тут мы будем писать программу
pge.gfx.enddrawing()
pge.gfx.swapbuffers()
end
Теперь займемся самой музыкой. Добавим разные действия. При нажатии вниз и вверх будет меняться громкость на 100, при нажатии на крестик будет воспроизводится, нолик - пауза (снять с паузы), квадрат - стоп, треугольник - повтор, включить и выключить, и при нажатии влево и вправо будет меняться трек:
if pge.controls.pressed (PGE_CTRL_CROSS) then
pge.mp3.play("music/" .. mus .. ".mp3")
elseif pge.controls.pressed (PGE_CTRL_RIGHT) then
mus = mus + 1
elseif pge.controls.pressed (PGE_CTRL_LEFT) then
mus = mus - 1
elseif pge.controls.pressed (PGE_CTRL_TRIANGLE) then
if loop == true then
loop = false
else
loop = true
end
pge.mp3.loop(loop)
elseif pge.controls.pressed (PGE_CTRL_CIRCLE) then
pge.mp3.pause()
elseif pge.controls.pressed (PGE_CTRL_SQUARE) then
pge.mp3.stop()
elseif pge.controls.held (PGE_CTRL_UP) then
vol = vol + 100
elseif pge.controls.held (PGE_CTRL_DOWN) then
vol = vol - 100
end
Так же есть предложение добавить что бы при нажатии на старт мы выходили на главное меню, в этом нам поможет команда "break" (для тех кто не знает, с помощью этой команды можно выйти с цикла):
if pge.controls.pressed (PGE_CTRL_START) then
pge.mp3.stop()
break
end
Теперь нам надо поставить огранечители, что бы мы не смогли поставить минусовую громкость или трек которого нет:
if mus 2 then
mus = 1
end
if vol 100000 then
vol = 100000
end
Почти все готово осталось только заставить громкость меняться:
pge.mp3.volume(vol)
Вуаля наша программа работает, вот только все значения видит одна программа, это надо изменить, давайте выведем на экран всю нашу информацию:
arial:activate()
arial:print(0, 30, white, "Volume: " .. vol)
arial:print(0, 50, white, "Treak: " .. mus)
arial:print(0, 70, white, "Loop: " .. loop)
arial:print(0, 90, white, "Play: " .. pge.mp3.isplaying()
Ну теперь программа полностью готова, давайте посмотрим что у нас в конечном итоге получилось:
vol = 32678 -- громкость
mus = 1 -- трек
loop = false -- повтор
while pge.running() do
pge.controls.update()
pge.gfx.startdrawing()
pge.gfx.clearscreen()
if pge.controls.pressed (PGE_CTRL_START) then -- выход в главное меню
pge.mp3.stop()
break
elseif pge.controls.pressed (PGE_CTRL_CROSS) then -- вопроизвести
pge.mp3.play("music/" .. mus .. ".mp3")
elseif pge.controls.pressed (PGE_CTRL_RIGHT) then -- переключить на другой трек
mus = mus + 1
elseif pge.controls.pressed (PGE_CTRL_LEFT) then
mus = mus - 1
elseif pge.controls.pressed (PGE_CTRL_TRIANGLE) then -- включить (выключить) повтор
if loop == true then
loop = false
else
loop = true
end
pge.mp3.loop(loop)
elseif pge.controls.pressed (PGE_CTRL_CIRCLE) then -- поставить на паузу (воспроизвести)
pge.mp3.pause()
elseif pge.controls.pressed (PGE_CTRL_SQUARE) then -- остановить
pge.mp3.stop()
elseif pge.controls.held (PGE_CTRL_UP) then -- увеличить громкость
vol = vol + 100
elseif pge.controls.held (PGE_CTRL_DOWN) then -- уменьшить громкость
vol = vol - 100
end
if mus 2 then
mus = 1
end
if vol 100000 then
vol = 100000
end
pge.mp3.volume(vol) -- меняем громкость
arial:activate()
arial:print(0, 30, white, "Volume: " .. vol) -- выводим громкость
arial:print(0, 50, white, "Treak: " .. mus) -- выводим трек
if loop then -- выводим есть повтор или нету
arial:print(0, 70, white, "Loop: true")
else
arial:print(0, 70, white, "Loop: false")
end
if pge.mp3.isplaying() then -- выводим играет музыка или нет
arial:print(0, 90, white, "Play: true")
else
arial:print(0, 90, white, "Play: false")
end
pge.gfx.enddrawing()
pge.gfx.swapbuffers()
end
Приступим к написанию "wav.lua". Так как на данный момент на моих часах 2 часа, и я хочу спать я напишу в моей статье программу лиш для одной песни, но в тестовой программе которую я прикреплю будет 9 звуков и 1 песня. И так переместим музыку в папку "music" и назовем ее "1.wav", теперь же приготовим все наши переменные, сделаем из нашей музыки объект и подготовим нашу программу:
wav1 = pge.wav.load("music/1.wav") -- делаем объект
ld = 50 -- громкость левого динамика
rd = 50 -- громкость правого динамика
while pge.running() do
pge.controls.update()
pge.gfx.startdrawing()
pge.gfx.clearscreen()
-- тут мы будем писать программу
pge.gfx.enddrawing()
pge.gfx.swapbuffers()
end
В начале начнем с действий. Крестик - воспроизвести, квадрат - остановить, треугольник - включить или выключить повтор, вверх или вниз - изменить громкость обоих динамиков, левый или правый стик + вверх или вниз - изменить громкость одного из динамиков (в зависимости какой стик был зажат):
if pge.controls.pressed (PGE_CTRL_CROSS) then
if (ld > 0) or (rd > 0) then
pge.wav.play(wav1)
end
elseif pge.controls.pressed (PGE_CTRL_SQUARE) then
pge.wav.stopall()
elseif pge.controls.pressed (PGE_CTRL_TRIANGLE) then
wav1:loop()
elseif pge.controls.held (PGE_CTRL_LTRIGGER + PGE_CTRL_UP) then
ld = ld + 1
elseif pge.controls.held (PGE_CTRL_RTRIGGER + PGE_CTRL_UP) then
rd = rd + 1
elseif pge.controls.held (PGE_CTRL_UP) then
rd = rd + 1
ld = ld + 1
elseif pge.controls.held (PGE_CTRL_LTRIGGER + PGE_CTRL_DOWN) then
ld = ld - 1
elseif pge.controls.held (PGE_CTRL_RTRIGGER + PGE_CTRL_DOWN) then
rd = rd - 1
elseif pge.controls.held (PGE_CTRL_DOWN) then
rd = rd - 1
ld = ld - 1
end
Теперь сделаем проверку на допустимые рамки для звука:
if ld > 100 then
ld = 100
elseif ld 100 then
rd = 100
elseif rd 0) or (rd > 0) then
pge.wav.play(wav1)
end
elseif pge.controls.pressed (PGE_CTRL_START) then -- выходим к главному меню
pge.wav.stopall()
break
elseif pge.controls.pressed (PGE_CTRL_SQUARE) then -- останавливаем всю музыку
pge.wav.stopall()
elseif pge.controls.pressed (PGE_CTRL_TRIANGLE) then -- включить (выключить) повтор
wav1:loop()
elseif pge.controls.held (PGE_CTRL_LTRIGGER + PGE_CTRL_UP) then -- меняем громкость
ld = ld + 1
elseif pge.controls.held (PGE_CTRL_RTRIGGER + PGE_CTRL_UP) then
rd = rd + 1
elseif pge.controls.held (PGE_CTRL_UP) then
rd = rd + 1
ld = ld + 1
elseif pge.controls.held (PGE_CTRL_LTRIGGER + PGE_CTRL_DOWN) then
ld = ld - 1
elseif pge.controls.held (PGE_CTRL_RTRIGGER + PGE_CTRL_DOWN) then
rd = rd - 1
elseif pge.controls.held (PGE_CTRL_DOWN) then
rd = rd - 1
ld = ld - 1
elseif pge.controls.pressed (PGE_CTRL_RIGHT) then -- меняем трек
mus = mus + 1
elseif pge.controls.pressed (PGE_CTRL_LEFT) then
mus = mus - 1
end
if ld > 100 then -- устанавливаем проверку громкости
ld = 100
elseif ld 100 then
rd = 100
elseif rd < 0 then
rd = 0
end
wav1:volume(ld, rd) -- меняем громкость
arial:activate()
arial:print(0,50,white,"Volume L: " .. ld) -- выводим громкость левого динамика
arial:print(0,70,white,"Volume R: " .. rd) -- выводим громкость правого динамика
if wav1:isplaying() then
arial:print(0, 90, white, "Play: true")
else
arial:print(0, 90, white, "Play: false")
en
pge.gfx.enddrawing()
pge.gfx.swapbuffers()
end
На этом моя статья подошла к концу, надеюсь вам понравилось, если будут какие то вопросы задавайте, на все отвечу!
Тестовая программа