FreeBasic
Главная
Вход
Регистрация
Пятница, 26.04.2024, 01:38Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Музыка (Музыкальное оформление и звуковые эффекты)
Музыка
RoloverДата: Понедельник, 22.07.2013, 19:49 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline
Скажите пожалуйста.
Музыку реально подключить или проигрывать в программах на FB, особенно интересует в играх звуковые эффекты  ну и фоновая мелодия
Может просто в уроках добавить???


Объяснив другому, поймешь, что понял сам.

Сообщение отредактировал Rolover - Понедельник, 22.07.2013, 19:49
 
haavДата: Понедельник, 22.07.2013, 20:04 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Попробуйте скачать библиотеку FBSOUND. В архиве масса примеров.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ПавелДата: Вторник, 23.07.2013, 11:49 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 21
Репутация: 0
Статус: Offline
fmod и bass еще хорошие

Сообщение отредактировал Павел - Вторник, 23.07.2013, 11:49
 
raisaДата: Пятница, 14.02.2014, 17:55 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Друзья, это мой первый выход в программистское сообщество
+ гуманитарное образование + возраст. Так что строго не судите...
 
В прошлом году скачала и установила FreeBasic_BUILD024.exe –
спасибо!
Начала программировать – получается... вот и добралась до
МУЗЫКИ...
Много хорошего слышала про библиотеку FMOD – решила попробовать,
но везенье закончилось!
 
Помогите, пожалуйста, выполнить динамическую компоновку.
Взяла файл из
сборки ...\Compilier\examples\sound\FMOD\fmod.dll
и положила в системную папку C:\Windows\System32\
По совету знакомого попыталась зарегистрировать этот файл:
>regsvr32 fmod.dll
Получила следующее сообщение:
fmod.dll была загружена, но найти точку входа для
DllRegisterServer не удалось!
Зарегистрировать этот файл невозможно!

Посоветуйте: что делать?
 
haavДата: Пятница, 14.02.2014, 18:20 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Здравствуйте raisa!

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

1) файл fmod.dll должен находиться в папке со скомпилируемым EXE файлом вашей программы
2) Просто положить файл fmod.dll в папку C:\Windows\System32\  . В этом случае вы можете запускать EXE файл вашей программы из любого места на вашем жестком диске. То есть ваша программа найдет fmod.dll ,  поскольку папка C:\Windows\System32\  является глобальной для системы , именно там лежат все системные библиотеки.
3) Есть еще третий способ, но я не буду вам выкручивать мозги smile


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
raisaДата: Суббота, 15.02.2014, 12:18 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Уважаемый haav,
затея регистрировать библиотеку пришла не случайно!
Все прекрасно работает, если используется статическая компоновка...
 
Вот обнадеживающее начало моих поисков:
#Inclib "fmod.dll"
' загрузить библиотеку в память и получить идентификатор
Dim As
Any Ptr Library = DyLibLoad("fmod.dll")
' если библиотека не загрузилась остановить программу
If
Library = 0 Then
   Print " Failed to load the fmod.dll, abortingprogram..."
Else
   Print " Library fmod.dll isloaded..."
End If
Sleep
Как и следовало ожидать, программа вывела:
Library
fmod.dll is loaded...
 
Дописала программу:
#Inclib "fmod.dll"
' загрузить библиотеку в память и получить идентификатор
Dim As
Any Ptr Library = DyLibLoad("fmod.dll")
Dim As
Any Ptr Func
' если библиотека не загрузилась остановит программу
If
Library = 0 Then
   Print " Failed to load the fmod.dll,aborting program..."
Else
   Print " Library fmod.dll isloaded..."
End If
' получить адрес функции в библиотеке
Func =
DyLibSymbol(Library, "FSOUND_GetVersion")
If Func = 0 Then
' если не удалось получить адрес функции
   Print " Could not retrieve the
function address..."
End If
Sleep
Здесь программа неожиданно вывела:
Could
not retrieve the function address...
т.е. она не смогла получить адрес функции...
 
Простите, но я даже не знаю, где располагается скомпилированный
EXE-файл, т.е. Ваш пункт 1 выполнить не смогла - безвылазно
работаю в оболочке FbEdit...
 
И еще – как на этом сайте нужно выделять фрагменты
программ?
 
haavДата: Суббота, 15.02.2014, 14:55 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Давайте с самого простого. Для того, чтобы получить EXE файл программы, ее надо скомпилировать. Я подозреваю, что вы все программы запускали по клавише F5 или кнопке тулбара "быстрый запуск".

Что получается , когда вы нажимаете F5:

  • Программа компилируется и создается EXE файл
  • Запускается EXE файл программы и вы видите результат выполнения
  • После того как программа отработала, EXE файл удаляется. Это нужно , чтобы не плодить много скомпилированных EXE файлов на вашем жестком диске.


То есть быстрый запуск подходит для тестирования программ.

Если вы уже дописали программу и хотите , чтобы ей пользовался кто-то другой, вам нужно ее скомпилировать в EXE файл так, чтобы он не удалился. Для этого вам нужно:
  • сохранить исходный текст вашей программы в любое место на диске, например на рабочий стол. Делается это прямо из редактора FbEdit . Заходите в меню "Файл" и дальше "Сохранить как" . Сохраняете его как файл с расширением .bas



  • Дальше нажимаете сочетание клавиш SHIFT+CTRL+F5 . Либо в меню "Сборка" пункт "Собрать". Либо кнопкой тулбара , как на рисунке ниже. При этом обратите внимание на опцию справа, чтобы у вас было "Windows Console" . Если у вас не так, измените. Ведь вы пока наверно создаете только консольные программы.



Дальше просто заходите в ту папку , в которой вы сохранили исходный текст вашей программы .bas, там будет и скомпилируемый файл .exe (его я называю EXE файлом) с таким же именем как исходный текст (если конечно вы не наделали ошибок в программе). Если ваша программа написана без ошибок, и EXE файл появился в нужной папке , вы можете его запустить уже без редактора FbEdit и посмотреть выполнение вашей программы.

В случае с библиотеками DLL и в частности fmod.dll, вам нужно их держать рядом с EXE файлом вашей программы. Либо , если вы пока еще только тестируете вашу программу и готовый EXE файл вам пока не нужен, то положите DLL рядом с файлом, в котором написан исходный текст программы (рядом с файлом .bas) и тогда для тестов пользуетесь "Быстрым запуском" по клавише F5.
Теперь что касается подключения самой библиотеки fmod.dll. Раз вы решили научиться динамическому подключению библиотеки, то должны понимать, что вам придется загружать каждую функцию вручную. В случае с fmod.dll я считаю это лишним, но уметь подключать динамически любую библиотеку нужно. Для того, чтобы это делать без ошибок, в первую очередь надо посмотреть в любом HEX редакторе , как данная функция называется в самой библиотеке dll. Устанавливаете себе любой HEX редактор на компьютер, я предпочитаю этот: http://mh-nexus.de/en/hxd/ . Дальше открываете в нем файл fmod.dll и ищете в нем название функции FSOUND_GetVersion :



Как видите, названия функций разделяются точками. Но впереди у функции FSOUND_GetVersion есть знак подчеркивания  "_ " . То есть реальное название функции _FSOUND_GetVersion Именно поэтому компилятор Freebasic сообщил, что он не может найти данную функцию. Если вы передатите ему правильное название, то ошибки не будет. Ваш код должен быть примерно таким:


Код
#Inclib "fmod.dll"
' загрузить библиотеку в память и получить идентификатор
Dim As Any Ptr Library = DyLibLoad("fmod.dll")
Dim As Any Ptr Func
' если библиотека не загрузилась остановит программу
If Library = 0 Then
    Print " Failed to load the fmod.dll,aborting program..."
Else
    Print " Library fmod.dll isloaded..."
End If
' получить адрес функции в библиотеке
Func = DylibSymbol(Library, "_FSOUND_GetVersion")
If Func = 0 Then
' если не удалось получить адрес функции
    Print " Could not retrieve the function address..."
End If
Sleep

Теперь что касается оформления кода на сайте, посмотрите внимательно при создании сообщения, есть теги:



Поставьте курсор в то место сообщения куда вам нужно вставить код. Нажмите на тег "Code" . На том месте , где был курсор появится рамка. Вставьте ваш код в рамку.
Прикрепления: 1437851.png (12.6 Kb) · 7579027.png (4.3 Kb) · 7679369.png (41.7 Kb) · 9056320.png (12.1 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
raisaДата: Суббота, 15.02.2014, 17:16 | Сообщение # 8
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Вы настоящий Специалист и Вы правы, я использую
"быстрый запуск":
- Программа компилируется и создается EXE-файл.
- Запускается EXE-файл программы и вижу результат
выполнения.
- После того как программа отработала, EXE файл
удаляется.
 
Будем считать, что занимаюсь тестированием
программ и хочу научиться на примере fmod.dll подключать динамически любую
библиотеку.
 
Странно, что таким непростым способом нужно определить
имя функции, которое должно быть прописано в заголовочном файле...
 
Для меня теперь другая загвоздка – как использовать
полученный адрес функции?
 
Чуть было все не поломала... своей корявой вставкой...
 
Код
#Inclib "fmod.dll"
' загрузить библиотеку в память и получить идентификатор
Dim As
Any Ptr Library = DyLibLoad("fmod.dll")
Dim As
Any Ptr Func
Dim As
Single FMODver
' если библиотека не загрузилась остановит программу
If
Library = 0 Then
    Print " Failed to load thefmod.dll,aborting program..."
Else
    Print " Library fmod.dll isloaded..."
End If
' получить адрес функции в библиотеке
Func =
DylibSymbol(Library, "_FSOUND_GetVersion")
If Func = 0 Then
' если не удалось получить адрес функции
    Print " Could not retrieve the
function address..."
Else
       Print " Address of the function_FSOUND_GetVersion ="; Func
End If
FMODver
= _FSOUND_GetVersion ' <-- что писать здесь?
Print
" FMOD version = "; FMODver
DyLibFree(Library)
Sleep


 
haavДата: Суббота, 15.02.2014, 18:34 | Сообщение # 9
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата
Странно, что таким непростым способом нужно определить
имя функции, которое должно быть прописано в заголовочном файле...

Такой способ как раз для тех библиотек, для которых не написано заголовочных файлов. Понятно, что для fmod.dll они описаны. И использовать ее удобнее, подключая заголовок.

Теперь по коду:

Вы написали не совсем верно описание для указателя функции и я просмотрел сразу smile

В общем так не описывают указатель для функции:

Цитата
Dim As Any Ptr Func


Данную функцию надо описывать так:

Код
Dim Func As function() as single


Но в общем не буду парить вам мозги, вот код:


Код
#Inclib "fmod.dll"
' загрузить библиотеку в память и получить идентификатор
Dim As Any Ptr Library = DyLibLoad("fmod.dll")
Dim Func As function() as single  ' указатель на функцию
Dim As Single FMODver
' если библиотека не загрузилась остановит программу
If Library = 0 Then
     Print " Failed to load thefmod.dll,aborting program..."
Else
     Print " Library fmod.dll isloaded..."
End If
' получить адрес функции в библиотеке
Func = DylibSymbol(Library, "_FSOUND_GetVersion")
If Func = 0 Then
' если не удалось получить адрес функции
     Print " Could not retrieve the function address..."
Else
        Print " Address of the function_FSOUND_GetVersion ="; Func
End If

FMODver = Func()  
Print " FMOD version = "; FMODver
DyLibFree(Library)
Sleep


Посмотрите и сравните со своим. Да кроме того, вместо имени func во всем коде, вы можете написать то, что ближе подходит , например GetFmodVersion .


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
raisaДата: Суббота, 15.02.2014, 18:59 | Сообщение # 10
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Дорогой haav, Вы вернули мне веру в силу человеческого разума!
 
Но оказалось, что у вас, у технарей заморочек не меньше,
чем у гуманитариев...
Ну как я могла знать, что FreeBASIC допускает
такие крутые конструкции:
Dim Func
As function() as Single ' указатель
на функцию
Это нельзя понять, это нужно запомнить (из анекдота)!
 
Теперь нужно время все это переварить.
Спасибо!!!

Добавлено (15.02.2014, 18:59)
---------------------------------------------
Совсем забылао от радости:
А что же мой Windows не хочет регистрировать этот
файл?
>regsvr32 fmod.dll
Выдает следующее сообщение:
fmod.dll была загружена, но найти точку входа для
DllRegisterServer не удалось!
Зарегистрировать этот файл невозможно!

 
haavДата: Суббота, 15.02.2014, 19:43 | Сообщение # 11
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата raisa ()
Совсем забылао от радости:А что же мой Windows не хочет регистрировать этот
файл?
>regsvr32 fmod.dll
Выдает следующее сообщение:
fmod.dll была загружена, но найти точку входа для
DllRegisterServer не удалось!
Зарегистрировать этот файл невозможно!

Я даже не знаю как проще объяснить. В общем есть обычные DLL библиотеки, а есть специально оформленные (Com DLL сервера). В последних заложен код для регистрации в системе, а так же реализованы методы , которые могут использоваться любыми языками, поддерживающие COM (Component Object Model). Язык Freebasic не относится к таким языкам, но все таки это не значит, что такие DLL он не сможет использовать или создавать. Просто на Freebasic это будет сложнее , чем скажем в Delphi.  Как вы понимаете библиотека fmod относится к первому типу, именно поэтому система не найдя модуля регистрации в этой DLL , высветила ошибку.

И кстати:

На самом деле данную запись:

Код
Dim Func As function() as single

Обычно называют прототипом функции. Это у FSOUND_GetVersion нет параметров. А вот скажем у функции FSOUND_PlaySound уже несколько параметров. Ее прототип будет выглядеть так:


Код
Dim FmodPlaySound as Function( byval channel as integer, byval sptr as any ptr) as integer


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
raisaДата: Воскресенье, 16.02.2014, 13:08 | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
Не знаю, как и благодарить Вас!
 
Поняла совсем немного, но главное появилась уверенность,
что ни мой Windows, ни вложенная библиотека fmod.dll – не бракованные и можно продолжать упражнения в программировании.
Буду вдвойне рада, если наша беседа станет полезна и другим, уже продвинутым,
пользователям.
 
Уверена, что Вашими стараниями оно так и будет.
 
Форум » Freebasic » Вопросы по языку FreeBasic » Музыка (Музыкальное оформление и звуковые эффекты)
  • Страница 1 из 1
  • 1
Поиск: