Discussion in "General help Guidance and Discussion" started by    Aris APA    Sep 12, 2007.
Wed Sep 12 2007, 01:56 pm
#1
Hello all,
I want to record a sound to a Flash Memory MX29F016 so to playback it with the help of an 8051 as many times as i want. The sound is in wav file format.
I have tried the wellknown ISD chipcorder chips but it failed to playback well the high frequencies. These kind of chips support up to 8KHz sample rate. I want more 22KHz at 8 bit.

Any suggestion of how to record the sound to Memory?
Is there any method to sample my sound with my PC sound card?
Thanks
Wed Sep 12 2007, 02:51 pm
#2
recording i have not tried yet but i have done playback at a rate of 44Khz i used Roman Black's BTc algorithm and software to make pre recorded sound. The o/p is not very good but when else can you expect from an 8-bit controller..
here is the sample of what i recorded on my PC when my 8051 was talking
http://www.8051projects.net/forum-t2092.html
 Aris APA like this.
Wed Sep 12 2007, 03:08 pm
#3
Thanks for your reply Ajay,

so i suppose you used only one 8051 without externel memory. Why the voice quality was bad?

How did you convert your voice to a PCM stream of 8 bit?

I still cannot understand how can i take in one file my voice sampled at 22kHz with 8bit. Please advice.
Wed Sep 12 2007, 04:27 pm
#4
the voice quality is bad.. i think i didnot use any filter or anything.. i directly i/p the voice to my PC MIC input and recorded it.. maybe thats the reason its not so good.. if i hear the same sound on my headphones it comes much better.. so.. all i need is a good filter there..

Regarding the conversion of the sound.. As i said.. i used Roman Black's BTc algorithm.
Please check it at his website, its clever algorithm and really amazing.. http://romanblack.com/btc_alg.htm
Sun Sep 16 2007, 11:52 pm
#5
i have a AT24c512 chip how can i use it
Mon Sep 17 2007, 12:47 am
#6
read data from it.. and send it to port.. the only problem could be the delay.. then you might need to use a lower bitrate.
I am actually thinking of your idea.. as you said you have played using C from parallel port. if you can give more idea on it.. then maybe we can play wav file or something directly from 8051 or any other controller.
Mon Sep 17 2007, 12:54 am
#7
ya circuit was this


[ Edited Mon Sep 17 2007, 01:12 am ]
Mon Sep 17 2007, 12:57 am
#8
here goes code


#include "Sounds.h"

void DisplayTip(char *string)
{
text_info tinf;
if(strlen(string)<75)
{
gettextinfo(&tinf);
textbackground(LIGHTGRAY);textcolor(RED);
gotoxy(2,25);
for(int i=0;i<75;i++) cprintf(" ");
gotoxy(2,25);
cprintf(string);
textattr(tinf.attribute);
gotoxy(tinf.curx,tinf.cury);
}
return;
}

void Window(int x1,int y1,int x2,int y2,char *caption,int BackCol,int TextCol)
{
text_info tinfo;
int i,j;
gettextinfo(&tinfo);
textbackground(BackCol);textcolor(TextCol);
for(j=y1;j<=y2;j++){
gotoxy(x1,j);
for(i=x1;i<=x2;i++)
cprintf(" ");
}
gotoxy(x1+1,y1);
for(i=x1+1;i<=x2-1;i++)
cprintf("%c",205);
gotoxy(x1+1,y2);
for(i=x1+1;i<=x2-1;i++)
cprintf("%c",205);
for(j=y1+1;j<=y2-1;j++){
gotoxy(x1,j);
cprintf("%c",186);
gotoxy(x2,j);
cprintf("%c",186);
}
gotoxy(x1,y1);cprintf("%c",201);
gotoxy(x2,y1);cprintf("%c",187);
gotoxy(x1,y2);cprintf("%c",200);
gotoxy(x2,y2);cprintf("%c",188);

if(caption!=NULL){
textcolor(WHITE);
gotoxy(x1+2,y1);
cprintf("%s",caption);
}

textattr(tinfo.attribute);
return;
}

void DrawScreen(void)
{
textbackground(LIGHTGRAY);textcolor(BLACK);
clrscr();
Window(1,2,80,24,NULL,BLUE,WHITE);
gotoxy(1,1);cprintf(" File Effects Operation");
textcolor(RED);
gotoxy(3,1);cprintf("F");
gotoxy(12,1);cprintf("E");
gotoxy(24,1);cprintf("O");
textbackground(BLUE);textcolor(LIGHTBLUE);
gotoxy(3,10);cprintf("** ** ***** * ** * * ******* ******* ");
delay(75);
gotoxy(3,11);cprintf("* * * * * * * * * * * * * *");
delay(75);
gotoxy(3,12);cprintf("* * * * * * * * * * * * * * ");
delay(75);
gotoxy(3,13);cprintf("* ** * * * * * * * ***** ***** ");
delay(75);
gotoxy(3,14);cprintf("* * ***** * ******** * * * * ");
delay(75);
gotoxy(3,15);cprintf("* * * * * * * * * * ");
delay(75);
gotoxy(3,16);cprintf("* * * * * * * * * * ");
delay(75);
gotoxy(3,17);cprintf("* * * ******* * * * ******* * *");
return;
}

void MenuInitialise(void)
{
int i;

// The FILE menu option
Menu[MNU_FILE].nextMenu=MNU_EFFECT;
Menu[MNU_FILE].prevMenu=MNU_OPERATION;
Menu[MNU_FILE].Child=FALSE;
Menu[MNU_FILE].num_items=4;
for(i=0;i<4;i++)
{
Menu[MNU_FILE].Enabled[i]=TRUE;
Menu[MNU_FILE].subMenu[i]=NONE;
Menu[MNU_FILE].String[i]=(char *)malloc(15);
Menu[MNU_FILE].Tip[i]=(char *)malloc(50);
Menu[MNU_FILE].OptionID[i]=1+i;
}
Menu[MNU_FILE].Enabled[1]=FALSE;
strcpy(&(Menu[MNU_FILE].String[0][0]),"Open");
strcpy(&(Menu[MNU_FILE].String[1][0]),"Save");
strcpy(&(Menu[MNU_FILE].String[2][0]),"-");
strcpy(&(Menu[MNU_FILE].String[3][0]),"Exit");
strcpy(&(Menu[MNU_FILE].Tip[0][0]),"Open the *.wav file");
strcpy(&(Menu[MNU_FILE].Tip[1][0]),"Save as a *.wav file");
strcpy(&(Menu[MNU_FILE].Tip[2][0])," ");
strcpy(&(Menu[MNU_FILE].Tip[3][0]),"Quit the program");
Menu[MNU_FILE].AtX=2;Menu[MNU_FILE].AtY=2;

// The EFFECT menu option
Menu[MNU_EFFECT].nextMenu=MNU_OPERATION;
Menu[MNU_EFFECT].prevMenu=MNU_FILE;
Menu[MNU_EFFECT].Child=FALSE;
Menu[MNU_EFFECT].num_items=5;
for(i=0;i<5;i++)
{
Menu[MNU_EFFECT].Enabled[i]=FALSE;
Menu[MNU_EFFECT].subMenu[i]=NONE;
Menu[MNU_EFFECT].String[i]=(char *)malloc(15);
Menu[MNU_EFFECT].Tip[i]=(char *)malloc(50);
Menu[MNU_EFFECT].OptionID[i]=11+i;
}
strcpy(&(Menu[MNU_EFFECT].String[0][0]),"Fade In");
strcpy(&(Menu[MNU_EFFECT].String[1][0]),"Fade Out");
strcpy(&(Menu[MNU_EFFECT].String[2][0]),"-");
strcpy(&(Menu[MNU_EFFECT].String[3][0]),"Reverse");
strcpy(&(Menu[MNU_EFFECT].String[4][0]),"Playback Rate");
strcpy(&(Menu[MNU_EFFECT].Tip[0][0]),"Reduce volume with increasing time");
strcpy(&(Menu[MNU_EFFECT].Tip[1][0]),"Increase volume with increasing time");
strcpy(&(Menu[MNU_EFFECT].Tip[2][0])," ");
strcpy(&(Menu[MNU_EFFECT].Tip[3][0]),"Reverse the wave file");
strcpy(&(Menu[MNU_EFFECT].Tip[4][0]),"Vary the Playnack Rate");
Menu[MNU_EFFECT].subMenu[0]=MNU_FADEIN;
Menu[MNU_EFFECT].subMenu[1]=MNU_FADEOUT;
Menu[MNU_EFFECT].AtX=11;Menu[MNU_EFFECT].AtY=2;

// The OPERATION menu option
Menu[MNU_OPERATION].nextMenu=MNU_FILE;
Menu[MNU_OPERATION].prevMenu=MNU_EFFECT;
Menu[MNU_OPERATION].Child=FALSE;
Menu[MNU_OPERATION].num_items=3;
for(i=0;i<3;i++)
{
Menu[MNU_OPERATION].Enabled[i]=FALSE;
Menu[MNU_OPERATION].subMenu[i]=NONE;
Menu[MNU_OPERATION].String[i]=(char *)malloc(15);
Menu[MNU_OPERATION].Tip[i]=(char *)malloc(50);
Menu[MNU_OPERATION].OptionID[i]=21+i;
}
strcpy(&(Menu[MNU_OPERATION].String[0][0]),"Play");
strcpy(&(Menu[MNU_OPERATION].String[1][0]),"-");
strcpy(&(Menu[MNU_OPERATION].String[2][0]),"Record");
strcpy(&(Menu[MNU_OPERATION].Tip[0][0]),"Play the file that was opened");
strcpy(&(Menu[MNU_OPERATION].Tip[1][0])," ");
strcpy(&(Menu[MNU_OPERATION].Tip[2][0]),"Record sound through the microphone");
Menu[MNU_OPERATION].AtX=23;Menu[MNU_OPERATION].AtY=2;

// The FADE-IN menu option
Menu[MNU_FADEIN].nextMenu=Menu[MNU_FADEIN].prevMenu=NONE;
Menu[MNU_FADEIN].Child=TRUE;
Menu[MNU_FADEIN].num_items=2;
for(i=0;i<2;i++)
{
Menu[MNU_FADEIN].Enabled[i]=FALSE;
Menu[MNU_FADEIN].subMenu[i]=NONE;
Menu[MNU_FADEIN].String[i]=(char *)malloc(15);
Menu[MNU_FADEIN].Tip[i]=(char *)malloc(50);
Menu[MNU_FADEIN].OptionID[i]=31+i;
}
strcpy(&(Menu[MNU_FADEIN].String[0][0]),"Linear");
strcpy(&(Menu[MNU_FADEIN].String[1][0]),"Exponential");
strcpy(&(Menu[MNU_FADEIN].Tip[0][0]),"Apply Linear attenuation or amplification");
strcpy(&(Menu[MNU_FADEIN].Tip[1][0]),"Apply Exponential attenuation or amplification");
Menu[MNU_FADEIN].AtX=33;Menu[MNU_FADEIN].AtY=2;

// The FADE-OUT menu option
Menu[MNU_FADEOUT].nextMenu=Menu[MNU_FADEOUT].prevMenu=NONE;
Menu[MNU_FADEOUT].Child=TRUE;
Menu[MNU_FADEOUT].num_items=2;
for(i=0;i<2;i++)
{
Menu[MNU_FADEOUT].Enabled[i]=FALSE;
Menu[MNU_FADEOUT].subMenu[i]=NONE;
Menu[MNU_FADEOUT].String[i]=(char *)malloc(15);
Menu[MNU_FADEOUT].Tip[i]=(char *)malloc(50);
Menu[MNU_FADEOUT].OptionID[i]=41+i;
}
strcpy(&(Menu[MNU_FADEOUT].String[0][0]),"Linear");
strcpy(&(Menu[MNU_FADEOUT].String[1][0]),"Exponential");
strcpy(&(Menu[MNU_FADEOUT].Tip[0][0]),"Apply Linear attenuation or amplification");
strcpy(&(Menu[MNU_FADEOUT].Tip[1][0]),"Apply Exponential attenuation or amplification");
Menu[MNU_FADEOUT].AtX=33;Menu[MNU_FADEOUT].AtY=2;
}

void RemoveMenu(int MenuID)
{
int i,j;
textbackground(BLUE);textcolor(WHITE);
gotoxy(Menu[MenuID].AtX,Menu[MenuID].AtY);
for(i=0;i<30;i++) cprintf("%c",205);
for(i=1;i<=Menu[MenuID].num_items+2;i++)
{
gotoxy(Menu[MenuID].AtX,Menu[MenuID].AtY+i);
for(j=0;j<30;j++) cprintf(" ");
}
return;
}

int ShowMenu(int MenuID)
{
MENU *menu;
int *subMenu;
int nextMenu, prevMenu;
char **String, **Tip;
int *OptionID;
BOOL *Enabled;
char IsChild;
int num_items;
int longLength,length;
int StartX,StartY;
int i,j;
int CurSelect=0,ch,RetVal;

menu=&(Menu[MenuID]);

num_items=menu->num_items;
String=menu->String;
nextMenu=menu->nextMenu;
prevMenu=menu->prevMenu;
subMenu=menu->subMenu;
IsChild=menu->Child;
OptionID=menu->OptionID;
Tip=menu->Tip;
Enabled=menu->Enabled;
StartX=menu->AtX;
StartY=menu->AtY;

longLength=strlen(String[0]);
if(subMenu[0]!=NULL) longLength+=3;
for(i=1;i {
length=strlen(String[i]);
if(subMenu[i]!=NULL) length+=3;
if(length>longLength) longLength=length;
}
textbackground(LIGHTGRAY);textcolor(WHITE);
for(i=StartY;i {
gotoxy(StartX,i);cprintf(" ");
gotoxy(StartX+longLength+5,i);cprintf(" ");
}
StartX++;
gotoxy(StartX,StartY);cprintf("%c",218);
for(i=0;i cprintf("%c",191);
gotoxy(StartX,num_items+StartY+1);cprintf("%c",192);
for(i=0;i cprintf("%c",217);
for(i=0;i {
if(String[i][0]!='-')
{
textcolor(WHITE);
gotoxy(StartX,StartY+i+1);cprintf("%c ",179);
if(Enabled[i])
textcolor(BLACK);
else
textcolor(BROWN);
gotoxy(StartX+2,StartY+i+1);
for(j=0;j if(j cprintf("%c",String[i][j]);
else
cprintf(" ");
textcolor(WHITE);
cprintf("%c",179);
}
else
{
textcolor(WHITE);
gotoxy(StartX,StartY+i+1);cprintf("%c",195);
for(j=0;j cprintf("%c",180);
}
}

for(;;)
{
DisplayTip(Tip[CurSelect]);
textbackground(GREEN);
if(Enabled[CurSelect])
textcolor(BLACK);
else
textcolor(BROWN);
gotoxy(StartX+1,StartY+CurSelect+1);
cprintf(" ");
for(j=0;j if(j cprintf("%c",String[CurSelect][j]);
else
cprintf(" ");
ch=getch();
if(ch==0) ch=getch();
ch+=300;
switch(ch)
{
case ESCAPE:
RemoveMenu(MenuID);
return(-1);
case ENTER:
RemoveMenu(MenuID);
if(Enabled[CurSelect]==TRUE)
return(OptionID[CurSelect]);
else
return(-1);
case LEFT_ARROW:
if(IsChild==TRUE)
{
RemoveMenu(MenuID);
return(0);
}
else
{
if(prevMenu!=NONE)
{
RemoveMenu(MenuID);
return(ShowMenu(prevMenu));
}
}
break;
case RIGHT_ARROW:
if(subMenu[CurSelect]!=NONE)
{
RetVal=ShowMenu(subMenu[CurSelect]);
if(RetVal!=0)
{
RemoveMenu(MenuID);
return(RetVal);
}
}
else
{
if(nextMenu!=NONE)
{
RemoveMenu(MenuID);
return(ShowMenu(nextMenu));
}
}
break;
case DOWN_ARROW:
textbackground(LIGHTGRAY);
if(Enabled[CurSelect])
textcolor(BLACK);
else
textcolor(BROWN);
gotoxy(StartX+1,StartY+CurSelect+1);
cprintf(" ");
for(j=0;j if(j cprintf("%c",String[CurSelect][j]);
else
cprintf(" ");
CurSelect++;
if(CurSelect==num_items) CurSelect=0;
while(String[CurSelect][0]=='-')
{
if(CurSelect==num_items)
CurSelect=0;
else
CurSelect++;
}
break;
case UP_ARROW:
textbackground(LIGHTGRAY);
if(Enabled[CurSelect])
textcolor(BLACK);
else
textcolor(BROWN);
gotoxy(StartX+1,StartY+CurSelect+1);
cprintf(" ");
for(j=0;j if(j cprintf("%c",String[CurSelect][j]);
else
cprintf(" ");
CurSelect--;
if(CurSelect<0) CurSelect=num_items-1;
while(String[CurSelect][0]=='-')
{
if(CurSelect<0)
CurSelect=num_items-1;
else
CurSelect--;
}
break;
}
}
}

void ButtonDisplay(int x1,int y1,char state,char *caption)
{
text_info tinfo;
gettextinfo(&tinfo);
int i;
if(state==ENABLE_NOTACTIVE) textcolor(YELLOW);
if(state==ENABLE_ACTIVE) textcolor(WHITE);
if(state==DISABLE) textcolor(LIGHTGRAY);
textbackground(CYAN);
gotoxy(x1,y1);cprintf(" %s ",caption);
textbackground(LIGHTGRAY);textcolor(YELLOW);
cprintf("%c",220);
gotoxy(x1+1,y1+1);for(i=0;i<8;i++) cprintf("%c",223);
textattr(tinfo.attribute);
}

void ButtonPushed(int x1,int y1,char *caption)
{
text_info tinfo;
gettextinfo(&tinfo);
int i;
textbackground(LIGHTGRAY);textcolor(WHITE);
gotoxy(x1,y1);cprintf(" ");
gotoxy(x1,y1+1);cprintf(" ");
textbackground(CYAN);
gotoxy(x1+1,y1);cprintf(" %s ",caption);
delay(250);
gotoxy(x1,y1);cprintf(" %s ",caption);
textbackground(LIGHTGRAY);textcolor(YELLOW);
cprintf("%c",220);
gotoxy(x1,y1+1);cprintf(" ");for(i=0;i<8;i++) cprintf("%c",223);
textattr(tinfo.attribute);
}

BOOL DisplayDialog(char mode)
{
int Control=0,ch;
int x=29,y=5,i=0,N=0;
char TempStr[40];TempStr[0]=0;
switch(mode)
{
case FILE_OPEN: Window(10,3,70,9,"Open File",LIGHTGRAY,YELLOW);break;
case FILE_SAVE: Window(10,3,70,9,"Save File",LIGHTGRAY,YELLOW);break;
case PLAYBACK_RATE: Window(10,3,70,9,"Playback Rate",LIGHTGRAY,YELLOW);break;
}

ButtonDisplay(25,7,ENABLE_NOTACTIVE," Ok ");
ButtonDisplay(45,7,ENABLE_NOTACTIVE,"Cancel");

textbackground(LIGHTGRAY);textcolor(YELLOW);
gotoxy(13,5);
if(mode==FILE_OPEN || mode==FILE_SAVE)
{
cprintf("Enter Filename: ");
strcpy(TempStr,sFileName);
N=39;
}
else
{
cprintf("Playback Rate : ");
strcpy(TempStr,sPlayBackRate);
N=5;
}
textbackground(BLUE);textcolor(WHITE);
cprintf(" ");
gotoxy(29,5);cprintf("%s",TempStr);
i=strlen(TempStr);
x+=i;

for(;;)
{
switch(Control)
{
case 0:
_setcursortype(_NORMALCURSOR);
textbackground(BLUE);textcolor(WHITE);
ButtonDisplay(45,7,ENABLE_NOTACTIVE,"Cancel");
gotoxy(x,y);
break;
case 1:
_setcursortype(_NOCURSOR);
ButtonDisplay(25,7,ENABLE_ACTIVE," Ok ");
break;
case 2:
ButtonDisplay(45,7,ENABLE_ACTIVE,"Cancel");
ButtonDisplay(25,7,ENABLE_NOTACTIVE," Ok ");
break;
}
ch=getch();
if(ch==0) ch=getch()+300;
ch+=300;
switch(ch)
{
case TAB:
Control=(++Control)%3;
break;
case ESCAPE:
_setcursortype(_NOCURSOR);
ButtonPushed(45,7,"Cancel");
ch=1; Control=2;
break;
case ENTER:
_setcursortype(_NOCURSOR);
ButtonPushed(25,7," Ok ");
ch=1;Control=1;
break;
case SPACE:
if(Control==2){_setcursortype(_NOCURSOR);ButtonPushed(45,7,"Cancel");ch=1;}
if(Control==1){_setcursortype(_NOCURSOR);ButtonPushed(25,7," Ok ");ch=1;}
break;
case BACK_SPACE:
if(Control==0 && i>0)
{
gotoxy(--x,y);
cprintf(" ");
i--;
TempStr[i]=0;
gotoxy(29,5);
cprintf("%s",TempStr);
}
break;
default:
ch-=300;
if(ch<300 && i {
TempStr[i]=(char)ch;
TempStr[i]=0;
gotoxy(29,5);
cprintf("%s",TempStr);
x++;
}
break;
}
if(ch==1) break;
}
textbackground(BLUE);textcolor(WHITE);
for(ch=3;ch<=9;ch++)
{
gotoxy(10,ch);
for(i=10;i<=70;i++)
cprintf(" ");
}
if(Control==1)
{
if(mode==FILE_SAVE || mode==FILE_OPEN) strcpy(sFileName,TempStr);
if(mode==PLAYBACK_RATE) strcpy(sPlayBackRate,TempStr);
return(TRUE);
}
return(FALSE);
}

void SetEnvVariables(){}
void SaveFile(){}

void main()
{
int ch;
textbackground(BLACK);textcolor(LIGHTGRAY);
clrscr();
_setcursortype(_NOCURSOR);
DrawScreen();
MenuInitialise();
sFileName[0]=0;
strcpy(sPlayBackRate,"22400");
for(;;)
{
DisplayTip("Ready");
ch=getch();
if(ch==0) ch=getch();
ch+=300;
switch(ch)
{
case AltF:ch=ShowMenu(MNU_FILE);break;
case AltE:ch=ShowMenu(MNU_EFFECT);break;
case AltO:ch=ShowMenu(MNU_OPERATION);break;
}
switch(ch)
{
case FILE_EXIT:
ch=AltX;
break;
case FILE_OPEN:
if(DisplayDialog(FILE_OPEN))
if(mOpen())
{
for(int i=0;i<5;i++)
Menu[MNU_EFFECT].Enabled[i]=TRUE;
Menu[MNU_OPERATION].Enabled[0]=TRUE;
for(i=0;i<2;i++)
{
Menu[MNU_FADEIN].Enabled[i]=TRUE;
Menu[MNU_FADEOUT].Enabled[i]=TRUE;
}
}
break;
case FILE_SAVE:
/*if(DisplayDialog(FILE_SAVE))
mSave();*/
break;
case FADEIN_LINEAR:
FadeCommon(FADEIN,LINEAR);
break;
case FADEIN_EXP:
FadeCommon(FADEIN,EXPONENTIAL);
break;
case FADEOUT_LINEAR:
FadeCommon(FADEOUT,LINEAR);
break;
case FADEOUT_EXP:
FadeCommon(FADEOUT,EXPONENTIAL);
break;
case REVERSE:
ReverseWave();
break;
case PLAYBACK_RATE:
if(DisplayDialog(PLAYBACK_RATE)==FALSE)
SetPlayBackRate(0);
else
SetPlayBackRate(1);
break;
case PLAY:
mPlay();
break;
}
if(ch==AltX)
{
_setcursortype(_NORMALCURSOR);
textcolor(LIGHTGRAY);
textbackground(BLACK);
clrscr();
printf("MPLAYER \n");
printf("--------------\n");
printf("\*************\n\n");
break;
}
}
}


[ Edited Mon Sep 17 2007, 01:26 am ]
 ajay_bhargav like this.
Mon Sep 17 2007, 01:32 am
#9
Thank you TPS..
well what is this code for? i know its a GUI, but what is the compiler?
and.. i want to know how to send data to port.. i mean the theory behind it.. the document you provided explain the wav format verywell but.. what is the theory behind playing them..
Mon Sep 17 2007, 01:56 am
#10
I think the above program is written in TURBO.c
and we would require sounds.h to run the above program,
the same circuit can be used to geneate many wave forms
sine ,square ,triangular ,sawtooth
to accesss the parallel port
we can use

#define PORT 0x378
outportb(PORT,i);
where i is integer

Get Social

Information

Powered by e107 Forum System

Downloads

Comments

Bobbyerilar
Thu Mar 28 2024, 08:08 am
pb58
Thu Mar 28 2024, 05:54 am
Clarazkafup
Thu Mar 28 2024, 02:24 am
Walterkic
Thu Mar 28 2024, 01:19 am
Davidusawn
Wed Mar 27 2024, 08:30 pm
Richardsop
Tue Mar 26 2024, 10:33 pm
Stevencog
Tue Mar 26 2024, 04:26 pm
Bernardwarge
Tue Mar 26 2024, 11:15 am