Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2008, 15:33   #1
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
Вопрос Амплитуда

Здравствуйте!!!
Хочу сделать график отображающий амплитуду на колонках, но не знаю как (амплитуду) узнать.(Delphi)

И еще, как в OpenGl сделать эффект “ Внешнего свечения“ ?

Последний раз редактировалось SuperVisor; 07.12.2008 в 23:10. Причина: Есть кнопка редактировать.
Levsha100 вне форума Ответить с цитированием
Старый 07.12.2008, 22:33   #2
in*tEr
 
Аватар для in*tEr
 
Регистрация: 07.12.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
Здравствуйте!!!
Хочу сделать график отображающий амплитуду на колонках, но не знаю как (амплитуду) узнать.(Delphi)
hi? как в делфи не знаю, давно забыл этот делфи, ваще советую, имхо, переходи на с++ (VisualC++.NET)

Итак, начнем по порядку, тебе надо написать свой модуль или библу воспроизведения муз файлов или прямого чтения со звуковой карты, или можно взять чужую, например BASS или FMOD

Вот пример про BASS:

// Добавь bass.lib еще

#include "bass.h"
...
#define SPECWIDTH 368 // Ширина спектра
#define SPECHEIGHT 127 // Высота спектра
...
HMUSIC Music; // Музон
DWORD len,dec,chan; // Музон: длина, положение, объект

float
fft[1024],
Y_Pos[28] //Сюда будет попадать сила спектра канала от 0.0 до 1.0
;

int
b0,
x,
y
;
...
BASS_Init(-1,44100,0,NULL,NULL); // Инициализация
Music=BASS_StreamCreateFile(FALSE," Music.mp3",0,0,0); // Загрузка mp3
BASS_ChannelPlay(Music,TRUE); // Начинаем играть
...
// Функция взятия спектра (28 штук)
void GetStreamMusic() {
b0=0;
BASS_ChannelGetData(Music,fft,BASS_ DATA_FFT2048);
#define BANDS 28
for (x=0;x<BANDS;x++) {
float sum=0;
int sc=pow(2.0,x*10.0/(BANDS-1));
int b1=pow(2.0,x*10.0/(BANDS-1));
if (b1>1023) b1=1023;
if (b1<=b0) b1=b0+1;
sc=10+b1-b0;
for (;b0<b1;b0++) sum+=fft[1+b0];
y=(sqrt(sum/log10(float(sc)))*1.7*SPECHEIGHT)-4;
if (y>SPECHEIGHT) y=SPECHEIGHT;
Y_Pos[x]=y*2;
Y_Pos[x]=Y_Pos[x]/255;
}
len=BASS_StreamGetFilePosition(Musi c,BASS_FILEPOS_END);
dec=BASS_StreamGetFilePosition(Musi c,BASS_FILEPOS_CURRENT);
if (dec>(len-10)) END=true;
}
...
GetStreamMusic();
// Вызов функции, после которой в Y_Pos[28]
// попадает спектрум звучания
// тут 28 каналов
// Ну и например glTranslatef(0,Y_Pos[0],0)
// Тут позиция Y будет зависеть от бассов песни
// басы [0][1][2][3] и.т.д.

Ваще, если надо очень напиши мыло свое - могу отправить рабочий исходник на С++
in*tEr вне форума Ответить с цитированием
Старый 07.12.2008, 22:42   #3
in*tEr
 
Аватар для in*tEr
 
Регистрация: 07.12.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Levsha100 Посмотреть сообщение
А как в OpenGl сделать эффект “ Внешнего свечения“ ?
То что ты хошь называется:
Радиальное размытие и текстурный рендеринг

Так что.. впрочем, вот просто код на С++ и OpenGL

//-------------------------------------------------------------------------
GLuint EmptyTexture() { // Создаем текстуру новую
GLuint txtnumber;
unsigned int* data;
data = (unsigned int*)new GLuint[((256 * 256)* 4 * sizeof(unsigned int))];
ZeroMemory(data,((256 * 256)* 4 * sizeof(unsigned int)));
glGenTextures(1, &txtnumber);
glBindTexture(GL_TEXTURE_2D, txtnumber);
glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0,
GL_RGBA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TE XTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TE XTURE_MAG_FILTER,GL_LINEAR);
delete [] data;
return txtnumber;
}
//-------------------------------------------------------------------------
void ReduceToUnit(float vector[3]) {
float length;
length = (float)sqrt((vector[0]*vector[0]) + (vector[1]*vector[1]) + (vector[2]*vector[2]));
if(length == 0.0f) length = 1.0f;
vector[0] /= length;
vector[1] /= length;
vector[2] /= length;
}
//-------------------------------------------------------------------------
void calcNormal(float v[3][3], float out[3]) {
float v1[3],v2[3];
static const int x = 0;
static const int y = 1;
static const int z = 2;
v1[x] = v[0][x] - v[1][x];
v1[y] = v[0][y] - v[1][y];
v1[z] = v[0][z] - v[1][z];
v2[x] = v[1][x] - v[2][x];
v2[y] = v[1][y] - v[2][y];
v2[z] = v[1][z] - v[2][z];
out[x] = v1[y]*v2[z] - v1[z]*v2[y];
out[y] = v1[z]*v2[x] - v1[x]*v2[z];
out[z] = v1[x]*v2[y] - v1[y]*v2[x];
ReduceToUnit(out);
}
//-------------------------------------------------------------------------
void Process(float X,
float Y,
float Z,
float Red,
float Green,
float Blue,
int TODO
) {
int phi;
GLfloat glfMaterialColor[]={1,1,1,1.0f};
GLfloat specular[]={Red,Green,Blue,1.0f};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glTranslatef(X,Y,Z);
glRotatef(angle/3.0f,0,0,1);
glMaterialfv(GL_FRONT_AND_BACK,GL_A MBIENT_AND_DIFFUSE,glfMaterialColor );
glMaterialfv(GL_FRONT_AND_BACK,GL_S PECULAR,specular);
glColor4f(1,1,1,1);

// Сюда рисуй че хочешь засветить

glPopMatrix();
}
//-------------------------------------------------------------------------
void RenderToTexture() {
glViewport(0,0,256,256);
glBindTexture(GL_TEXTURE_2D,0); // !
Process(HelX,HelY,HelZ,HelRed,HelGr een,HelBlue, HelTODO);
glBindTexture(GL_TEXTURE_2D,BlurTex ture);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 256, 256, 0);
glViewport(0 , 0, OknoX , OknoY);
}

// Тут создается свечение
//-------------------------------------------------------------------------
void DrawBlur(int times, float inc) {
float spost = 0.0f;
float alphainc = 0.1f / times;
float alpha = 0.4f;
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glBindTexture(GL_TEXTURE_2D,BlurTex ture);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 1024, 768 , 0, -1, 1 );
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
float DF=(Y_Pos[0]+Y_Pos[1]+Y_Pos[2]+Y_Pos[3])/3;
alphainc = alpha / times;
glBegin(GL_QUADS);
for (int num = 0;num < times;num++) {
glColor4f(1.0f, 1.0f, 1.0f, alpha);
glTexCoord2f(0+spost,1-spost);
glVertex2f(0,0);
glTexCoord2f(0+spost,0+spost);
glVertex2f(0,OknoY);
glTexCoord2f(1-spost,0+spost);
glVertex2f(OknoX,OknoY);
glTexCoord2f(1-spost,1-spost);
glVertex2f(OknoX,0);
spost += inc;
alpha = alpha - alphainc;
}
glEnd();
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
glBindTexture(GL_TEXTURE_2D,0);
glColor4f(1,1,1,1);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GLfloat specular[]={0.2,0.2,0.2,1.0f};
glMaterialfv(GL_FRONT_AND_BACK,GL_S PECULAR,specular);
}

// ну и потом
HelZ=0;
HelX=0;
HelY=0;
angle=0;
HelRed=0;
HelGreen=1;
HelBlue=1;
HelTODO=0;
BlurTexture = EmptyTexture();
RenderToTexture();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Process(HelX,HelY,HelZ,HelRed,HelGr een,HelBlue,HelTODO);

// Тут рисуй че нить че не надо светить

DrawBlur(10,0.02f);

//--------------


Тоже самое - надо оч пиши мыло - отправлю исходник

Советую книгу NEHE по программингу на OpenGL
Писать ща коменты к каждой строке нет смысла, так что лучше спросить че не ясно
in*tEr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц