AutoIt Français

Nouveau forum : http://www.autoitscript.fr/
 
AccueilFAQRechercherS'enregistrerMembresGroupesConnexionhttp://www.autoitscript.fr

Partagez | 
 

 le beep

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
ani
Modérateur
Modérateur


Nombre de messages : 563
Date d'inscription : 23/01/2007

MessageSujet: le beep   2007-05-11, 22:56

la question sera simple, par quel procédure on peut récuperer dans un son (mp3 ou midi ou autre format connu) la frequence et la duree (de la chanson)?

pour reproduire la mélodie avec beep(fréquence,durée) ?


Dernière édition par le 2007-05-12, 01:24, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
sylvanie
Modérateur
Modérateur


Nombre de messages : 300
Date d'inscription : 10/03/2007

MessageSujet: Re: le beep   2007-05-12, 01:10

pour la durée des mp3, wav et midi (ainsi que des formats video) tu peux utiliser winmm.dll comme ci dessou (fais pas attention au noms des variable, au début ce script était fait pour des vidéo mais ça marche aussi avec les format musicaux)

$video="I:\son\fichier.mid"
mciSendString("open "&$video&" alias myvideo")
$dureemilli = recupdureevideo()
MsgBox(0,"debug",$dureemilli)

Func mciSendString($string)
Local $ret
$ret = DllCall("winmm.dll","int","mciSendString","str",$string,"str","","int",65534,"hwnd",0)
If Not @error Then Return $ret[2]
EndFunc

;Fonction de récupération de la durée d'une vidéo
Func recupdureevideo()
Local $ret
mciSendString("set myvideo time format milliseconds")
$ret=mciSendString("status myvideo length")
If Not @error Then Return $ret
EndFunc

effet de bords potentiel, des pbs constatés quand il y a des espaces dans le chemin/ nom du fichier (dans ce cas une conversion du chemin / nom en format dos est nécessaire)

pour la fréquence,dans le cas des mp3, il existait une librairie dévelloppée à 2 ans par LazyCat, mais j'arrive pas à retrouver un lien sur le forum anglais, c'était get_mp3_info.au3; voilà le contenu du dit fichier :

;===============================================================================
;
; Description: Retrieve MP3 (MP2, MPA) basic information
; Parameter(s): File name
; Requirement(s): None
; Return Value(s): On Success - array with data:
; 0 - MPEG version
; 1 - Layer
; 2 - Bitrate
; 3 - Frequency
; 4 - Channel Mode
; 5 - Duration
; 6 - Frames
; 7 - CRC protected
; 8 - Copyrighted
; 9 - Original
; On Failure empty string and sets @ERROR:
; 1 - Info not found
; Author(s): YDY (Lazycat) <mpc@nm.ru>
; Version: 1.2.00
; Date: 30.12.2004
; Note(s): None
;
;===============================================================================
Func _GetMP3Info($file)
Local $data[10], $offset = 1, $isValid = 0, $isVBR = 0
Local $aVersion = StringSplit("MPEG 2.5|Undefined|MPEG 2.5|MPEG 1", "|")
Local $aLayer = StringSplit("Undefined|Layer III|Layer II|Layer I", "|")
Local $sBitrate = ""
Local $sFrequency = ""
Local $aChanMode = StringSplit("Stereo|Joint stereo|Dual channel|Mono", "|")
Local $aFlags = StringSplit("No|Yes", "|")
Local $head, $nVer, $nLay

If _FileReadAtOffsetHEX ($file, 1, 3) = "494433" Then ; ID3v2 tag found
$offset = _HEXToSSInt(_FileReadAtOffsetHEX ($file, 7, 4)) + 10 ; End of ID3v2 tag
Endif

For $ic = $offset to 4096 + $offset
$marker = _FileReadAtOffsetHEX ($file, $ic, 2)
$marker = StringLeft($marker, 3)
If StringInStr("FFF,FFE", $marker) Then ; Assume that is frame start
$head = _HexToBin(_FileReadAtOffsetHEX ($file, $ic, 4))
$nVer = _GetRBits($head, 19, 2)
$nLay = _GetRBits($head, 17, 2)
If ($nVer <> 1) and ($nLay <> 0) Then
If _FileReadAtOffsetHEX ($file, $ic+36, 4) = "58696E67" Then $isVBR = 1 ; Is this a right way?..
$isValid = 1
Exitloop
Endif
Endif
Next

If not $isValid Then
SetError(1) ; Frame not found (not mp3 data?)
Return ("")
Endif

Select
Case $nVer = 3
$sFrequency = "44100|48000|32000|Undefined"
Case $nVer = 2
$sFrequency = "22050|24000|16000|Undefined"
Case $nVer = 0
$sFrequency = "11025|12000|8000|Undefined"
EndSelect
Local $aFrequency = StringSplit($sFrequency, "|")
$data[3] = _GetData($aFrequency, _GetRBits($head, 10, 2))

Local $pad = 0, $bitrate, $framesize, $frames, $length, $fps
If _GetRBits($head, 9, 1) Then $pad = 1

If $isVBR Then
$data[2] = "Variable"
Else
Select
Case $nVer = 3 and $nLay = 3
$sBitrate = "Free|32|64|96|128|160|192|224|256|288|320|352|384|416|448|Undefined"
Case $nVer = 3 and $nLay = 2
$sBitrate = "Free|32|48|56|64|80|96|112|128|160|192|224|256|320|384|Undefined"
Case $nVer = 3 and $nLay = 1
$sBitrate = "Free|32|40|48|56|64|80|96|112|128|160|192|224|256|320|Undefined"
Case $nVer = 2 and $nLay = 3
$sBitrate = "Free|32|48|56|64|80|96|112|128|144|160|176|192|224|256|Undefined"
Case ($nVer = 2 and $nLay = 2) or ($nVer = 2 and $nLay = 1)
$sBitrate = "Free|8|16|24|32|40|48|56|64|80|96|112|128|144|160|Undefined"
EndSelect
Local $aBitrate = StringSplit($sBitrate, "|")
$data[2] = _GetData($aBitrate, _GetRBits($head, 12, 4))
$bitrate = 1000 * $data[2]
If $nLay = 3 Then
$framesize = (((12 * $bitrate) / $data[3]) + $pad) * 4
$fps = $data[3]/384
Else
$framesize = ((144 * $bitrate) / $data[3]) + $pad
$fps = $data[3]/1152
Endif
$frames = FileGetSize($file) / $framesize
$length = $frames / $fps
Endif

$data[0] = _GetData($aVersion, $nVer)
$data[1] = _GetData($aLayer, $nLay)
$data[4] = _GetData($aChanMode, _GetRBits($head, 6, 2))
$data[5] = StringFormat("%d:%02d", Int($length / 60), $length - Int($length / 60) * 60)
$data[6] = Int($frames)
$data[7] = _GetData($aFlags, not _GetRBits($head, 16, 1)) ; CRC
$data[8] = _GetData($aFlags, _GetRBits($head, 3, 1)) ; Private
$data[9] = _GetData($aFlags, _GetRBits($head, 2, 1)) ; Original
Return($data)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Support functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Func _GetRBits($str, $pos, $size)
Local $ic, $res = 0, $bStr = StringMid($str, 33 - $pos - $size, $size)
For $ic = 0 to $size-1
If StringMid($bStr, $size-$ic, 1) == "1" Then $res = $res + 2^$ic
Next
Return ($res)
EndFunc

Func _GetData(ByRef $array, $val)
If $val > UBound($array)-1 Then Return("Undefined")
Return ($array[$val+1])
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Common functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Func _HEXToSSInt($sHexStr)
Local $iCnt, $iLen, $sTempStr = "", $iReturn = 0
For $iCnt = 1 to StringLen($sHexStr) Step 2
$sTempStr = $sTempStr & StringTrimLeft(_HexToBin(StringMid($sHexStr, $iCnt, 2)), 1)
Next
$iLen = StringLen($sTempStr)
For $iCnt = 0 To $iLen - 1
$iReturn = $iReturn + Number(StringMid($sTempStr, $iLen - $iCnt, 1)) * 2^$iCnt
Next
Return($iReturn)
EndFunc

Func _HexToBin($str)
Local $res="", $i
While StringLen($str) > 0
$val = Dec(StringRight($str, 1))
$str = StringTrimRight($str, 1)
For $i = 1 to 4
$res = String(Mod($val, 2)) & $res
$val = Int($val/2)
Next
Wend
Return ($res)
EndFunc

Func _FileReadAtOffsetHEX ($file, $offset, $bytes)
Local $tfile = FileOpen($file, 0)
Local $tstr = "", $i
FileRead($tfile, $offset-1)
For $i = $offset To $offset + $bytes - 1
$tstr = $tstr & Hex(Asc(FileRead($tfile, 1)), 2)
Next
FileClose($tfile)
Return ($tstr)
Endfunc


;;;;=======================FIN du FICHIER

et voici un script de test associé :

#include "get_mp3_info.au3"
$file = FileOpenDialog("Please select file", "", "MPEG files (*.mp3;*.mp2;*.mpa)");
if @error then Exit
$aData = _GetMP3Info($file)
if @error then Exit
$aLabel = StringSplit("MPEG Version: |Layer: |Bitrate: |Frequency: |Channel Mode: |Duration: |Frames: |Have CRC: |Copyright: |Original: ", "|")
Dim $out = ""
for $i = 0 to UBound($aData)-1
$out = $out & $aLabel[$i+1] & $aData[$i] & @CR
next
MsgBox (0, "MPEG File Info", $out)


Par contre après, pour la conversion en BEEP ... je sais pas du tout , le plus jouable sera sûrement le midi qui s'approche "naturellement" du beep
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
ani
Modérateur
Modérateur


Nombre de messages : 563
Date d'inscription : 23/01/2007

MessageSujet: Re: le beep   2007-05-12, 01:21

encore merci sylvanie

après quelque recherche sur mon désir j'ai trouvé
mais faut que je traduise une page avec des freewares dont un décompiler midi et d'après ceux que j'en est compris sur le site anglais faut décompiler et voilà enfin je pense ^^'

par paulie avec une petite modification par wts et c'est vraiment trop bon

http://www.autoitscript.com/forum/index.php?showtopic=30069

vais déjà tester les décomp et voir si chez microsoft y a pas quelque chose d'y ressemblant beep(frequency,time) kernel32
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
ani
Modérateur
Modérateur


Nombre de messages : 563
Date d'inscription : 23/01/2007

MessageSujet: Re: le beep   2007-05-15, 14:35

bon je comprend rien si quelqu'un peut m'aider a ce sujet, de connaitre la maniere qu'il procede pour passer d'un fichier mdi en beep(frequence,durée) :§

merci ,, bein la dessus je retourne sur wikiland (apprendre apprendre)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: le beep   Aujourd'hui à 22:42

Revenir en haut Aller en bas
 
le beep
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» probleme avec alerte sonore
» La commande BEEP n'émet aucun son

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
AutoIt Français :: AutoIt v3 :: Entraide-
Sauter vers: