Windows Developer Community Message Board › Minitips om lyd

Minitips om lyd

Ronny G.
user 10923525
Oslo, NO
Post #: 14
Fikla mye med lyd for Hangman i helgen, og kort oppsummert så ble ståa slik

Det er to "måter" å spille av lydfiler på (er vel 3 egentlig), enten med Silverlight eller med XNA.

Silverlight er kjekt for store filer (=musikk), da man kan spille av komprimerte lyder (type WMA, ol), men skikkelig liten kontroll over de, fikk ikke en gang til å spille to lyder samtidig (det kan være meg selvfølgelig, er rookie på WP7 og Silverlight). Så Silverlight brukte jeg for bakgrunnsmusikken (pga komprimering).

I XNA får du ikke spillt av komprimerte lyder (i BETA iallefall), men til gjengjeld kan du her spille av lyder samtidig, sample over hverandre, legge ekko, 3D effekter, you name it. Og dette (XNA) skal visstnok kreve mye mindre ressureser på telefonen. Så XNA bruker jeg nå for lydeffektene mine (de er jo gjerne korte lyder, som noen ganger skal spilles samtidig med andre lyder).

Får man lov til å spille av komprimert lyd i XNA, så vil jeg bruke XNA til alle lyden i fremtiden...er litt "rotete" å ha to forskjellige metoder til dette i samme app...jeg er jo litt kode-nazi :D

Legger ikke på kode-eksempler her, men gjør det hvis noen ønsker det.
A former member
Post #: 1
Etter som jeg forstår det fra Microsoft så benytter man ikke mp3 etc til lydeffekter da disse må være tilgjengelige fra minnet i løpet av millisekunder. Derfor bruker man wav filer til dette. mp3 skal kun brukes til bakgrunnsmusikk etc der man kan ha litt delay før bruker skal høre lyden.

Man trenger, så vidt jeg vet, kun å bruke XNA sin måte å implementere lyd på. Dette gjelder for XNA og Silverlight applikasjoner.
Ronny G.
user 10923525
Oslo, NO
Post #: 16
Etter som jeg forstår det fra Microsoft så benytter man ikke mp3 etc til lydeffekter da disse må være tilgjengelige fra minnet i løpet av millisekunder. Derfor bruker man wav filer til dette. mp3 skal kun brukes til bakgrunnsmusikk etc der man kan ha litt delay før bruker skal høre lyden.
Det høres ut som en god grunn ja! :)
For lyd effekter er uansett XNA det rette valget også da det støtter flere lyder samtidig, og man kan legge på effekter enkelt (og slippe å ha seperate lydfiler for når noe kommer mot en, eller går vekk fra en, osv).

XNA rammeverket støtter forøvrig komprimert lyd (for Xbox og PC), bare ikke i mobil-varianten av rammeverket, enn så lenge iallefall.

Man trenger, så vidt jeg vet, kun å bruke XNA sin måte å implementere lyd på. Dette gjelder for XNA og Silverlight applikasjoner.
Man kan mikse som man vil, mao bruke "Silverlight varianten" i både Silverlight og i XNA, og man kan bruke "XNA-varianten" i både Silverlight og XNA. Så det er mer å bruke det som er mest hensiktsmessig.

Og siden Silverlight-varianten støtter komprimerte filer (og flere filformater, og hertz osv), så er Silverlight å foretrekke for å spille av bakgrunnsmusikk-filer (musikk går gjerne over minutter, og da blir en ukomprimert fil vanvittig stor).

Men er man flink med lyd, så kan man jo "lage" musikken med kode, som i "gode gamle dager", men der er iallefall ikke jeg.

En annen sak er jo også at et spill ikke nødvendigvis må ha bakgrunnslyd innebygd, du kan jo bruke mediaplayer og la bruker spille sin egen musikk (noe bruker alltids kan gjøre, men du kan tilby bruker muligheten til å velge musikk fra spillet hvis man vil).

Men de fleste spill bør nok ha med iallefall EN melodi som går som default...for et spill uten noen musikk (og bruker ikke har skjønt at han/hun kan velge bakgrunnsmusikk i Zune) blir fort litt tamt.

Jeg har ikke sett på den Mediaplayer saken enda...så den vet jeg fint lite om, men tenkte å titte på den de neste dagene.

En annen sak er at selv ukomprimert lyd er så mangt...man kan gjøre en lyd-effekt-fil vesentlig mindre uten at lyden nødvendigvis er merkbart dårligere, ved å forsøke seg med bits, hertz, og evt. mono/stereo. Så selv om du ikke kan komprimere lydfiler du spiller av med XNA, så kan du "tune" størrelsen på de uansett. Slikt kan gjøre en lydfil halvparten eller en fjerdedel så stor, så det kan være verdt det hvis du har mange forskjellige lydeffekter osv.
Ronny G.
user 10923525
Oslo, NO
Post #: 25
Mer tips om lyd, nå som jeg har fiklet litt:

Har du store lydfiler (typisk bakgrunnsmusikk), så bruk MediaElement (=Silverlight), da disse kan spille komprimert lyd.

Lydeffekter, så bruker du XNA, krever mindre resurser på telefonen, men husk å loade de på forhånd. Hvis ikke vil det ta et lite øyeblikk før de spiller, og evt. animasjoner ol du har som skal spilles av samtidig med effekten vil skippes eller lagge.

Merk også at MediaElementer spiller IKKE når mobilen er tilkoblet Zune på PC. Jeg fikk testet min app hos Smartphone Telecom, og skjønte ikke hvorfor bakgrunnsmusikken aldri spilte på den fysiske telefonen. Men det er en kjent issue. Kjør applikasjonen din på devicet uten at mobilen er tilkoblet PC'n, og da skal du høre musikken :)

Du vil noen ganger ønske at bakgrunnsmusikken i ditt program skal spille uavbrutt når bruker navigerer mellom skjermbildene i applikasjonen din. Da kan du følge tipsene her; http://briankassay.com/blog/?tag=wp7­, jeg har oppsummert alle stegene/koden under her.


Mini-guide for å legge til bakgrunnsmusikk for hele applikasjonen:
1. Legg filen til i prosjektet ditt som "Content"



2. Legge til MediaElement i App.xaml
<MediaElement x:Key="MediaBackgroundMusic" Volume="1.0" AutoPlay="False" Source="MyMusic.wma" />



3. Legge til en funksjon i App.xaml.cs som spiller/stopp musikken (eller som evt. gir tilgang til MediaElementet)
public void PlayBackgroundMusic()
{
MediaElement myME;
myME = (MediaElement)this.Resources["Media­BackgroundMusic"];
myME.Play();
}



4. Kall start/stopp musikken fra koden din.
App currentApp = (App)Application.Current;
currentApp.PlayBackgroundMusic();
­



Merk at MediaElement ser ikke ut til å fungere hvis du BYTTER fil den skal bruke mens programmet ditt kjører. Mao. du kan fint starte, stoppe og starte igjen musikken, men prøver du å bytte musikkfil den peker til, så virker dette bare en gang (jeg har iallefall ikke fått til å bytte mellom musikkfiler flere ganger under en kjøring). Så da må man evt. ha flere MediaElementer kan det se ut som.

Merk også at musikkfiler (uavhengig om du spiller de fra XNA eller Silverlight/MediaElement) bør legges til prosjektet som type "Content" (du trenger ikke å velge "Copy always", den ser ut til å automatisk kopiere ut filen uansett når du velger Content).

Ikke velg "Resource", siden den da vil bakes inn i DLL, og gjøre oppstart tregere (og dette vil bli enda værre når applikasjonen er signert etter innsending til Marketplace, så det anbefales og alltid velge Content). Content vil bakes inn i XAP-fila (installasjonsfila), men ikke inn i DLL'n i XAP-fila...hvis det ble forståelig? :)

Bruker kan også spille musikk gjennom Zune på mobilen, og det kan være helt uavhengig av din app selvfølgelig, men du kan også tilby brukeren mulighet til å velge "bakgrunnsmelodi" som skal spilles i Zune, direkte fra ditt program. Men det er noen jeg selv ikke har hatt bruk for enda, og derfor ikke tittet på, så null hjelp fra meg der i gården :(
Ronny G.
user 10923525
Oslo, NO
Post #: 26
Miniguide for å spille av lydeffekter:
1. Legg til lydfilen som type "Content"



2. Definer en lokal variabel for hver lydeffekt
private SoundEffectInstance _sfxWordCompleted;
...



3. I side som lydfilen skal brukes som effekt, "cache" lydfilen i en variabel (all caching bør forøvrig strengt tatt ikke gjøres i konstruktør/Load-event, men på Page_LayoutUpdated event, mer info om dette her Optimizing Silverlight Applications)
SoundEffect se3 = SoundEffect.FromStream(Microsoft.Xna.Fra­mework.TitleContainer.OpenStream("S­ounds/wordCompleted_yes.wav"));
_sfxWordCompleted = se3.CreateInstance();
_sfxWordCompleted.IsLooped = false;
_sfxWordCompleted.Volume = (float)Cache.SoundEffectVolume;
...




4. Spill av lydeffekt der du måtte ønske
_sfxWordCompleted.Play();




Da vil lydeffektene spille umiddelbart, og påvirke UI minst mulig.

Uten denne "pre-loadingen" så ble ikke mine korte "effekt-animasjoner" vist da jeg testet på LG utviklertelefonen til Smartphone, lyden ble spilt men ingen animasjon. Dette var ekstremt kjappe animasjoner (varer under et halv sekund), så det lille øyeblikket som trengs for å loade lydeffekten var nok til at animasjonen ble helt droppet. Men med pre-loading, ser alt korrekt ut på devicet.

I emulator merket jeg ikke dette...da min utvikler PC tydligvis er så kraftig at dette spilte helt fint uten preloading.
Powered by mvnForum

Our Sponsors

People in this
Meetup are also in:

Sign up

Meetup members, Log in

By clicking "Sign up" or "Sign up using Facebook", you confirm that you accept our Terms of Service & Privacy Policy