20120130: pour les historiens, voir la version 2011:
AndroidBranleurMp3Obsolete, et janvier 2012:
AndroidBranleurMp3PasLight
but: enregistrer les accélérations 3D dans un fichier wav (à lire par exemple avec
AudaCity).
ce programme convertit le fichier des accélérations enregistré par
AndroidBranleur pour le rendre visualisable par un lecteur MP3.
ce programme corrige les retards d'enregistrement du capteur sur la base de 20 Hz
produit 5 pistes:
- les trois axes
- le module de l'accélération
- le module du "delta".
pour programmeur:
pour l'écriture d'un .wav (mono):
http://antiguide.logsm.net/divers/v21/ , pour un autre chantier similaire:
KlimaloggPro2Wav
pour l'entête:
http://fr.wikipedia.org/wiki/WAVEform_audio_format#En-t.C3.AAte_de_fichier_WAV
zonage du fichier d'entrée (délimité par des espaces) postérieur à 0.5.5
- ignorer les lignes #
- les lignes @ @ donnent la seconde
- ligne courante:
- millisecondes (du traitement de l'accélérateur, retardé lors d'une écriture dans le fichier)
- prem >0 droid sur le flan gauche (bouton à droitre) <0 flan gauche (bouton à gauche) quand on regarde l'écran
- deux >0 droid debout bouton en bas <0 poirier (bouton en gaut)
- trois: >0 droid sur le dos (écran visible) <0sur le ventre (écran caché)
- signe > suivi du temps écoulé depuis le dernier top (facilite la reprise des point accumulés) pas vraiment nécessaire, à prendre en charge directement dans le programme de post-traitement.
20110704 (échange avec LE lecteur):
ben 'mp3' c'est un joke, ce serait dommage de dégrader les données, par contre .wav, c'est très sérieux (voir le paragraphe "non audio data de la page wikipedia: http://en.wikipedia.org/wiki/WAV )
cela permettra facilement d'explorer les trois directions en parallèle avec AudaCity (ou autre), et éventuellement d'entendre les vibrations!.
c'était sous la pile, mais ça vient de repasser sur le dessus.
je m'y colle!
c'est comme le .kml, je fais une maquette en vbscript, "ON" portera en java plus tard.
bug: je ne sais pas contrôler l'amplitude! actuellement chaque piste est limitée à l'intervalle [-10 à +10]
Usage:
- pour ajuster le chrono d'audacity, possible de modifier la première ligne en indiquant le top de départ souhaité (GAFFE: cela fait évicemment grossier le fichier .WAV)
version 20120208 (light):
' 20120208
' en cours gérer la file d'attente des messages
'20120208 capture branleur to wav
' adapté à Branleur 0.5.6 (version light)
' GAFFE: les points sont asynchrones
' le programme se charge de:
' - générer les points supplémntaires
' supprimer les points plus rapide que la fréquence
' la frequence de sortie est en dur ici!
frequence=20
prtlu=false ' imprimer lecture
dim fs
set fs=createobject("scripting.filesystemobject")
dim fi
dim fo
dim flog
dim nbechantillonparbit
dim nbpts
dim lu
nbliused=0
nbsecplus=0
nbhzplus=0
nbhzmoins=0
milli=0
millipre=0
pas=0
cumul=0
xp=0
yp=0
zp=0
nbg=0
nbtop=0
perdu=0
Set args = Wscript.Arguments
if nom="" then
if args.count =1 then
nom=args(0)
else
nom=inputbox("Conversion Branleur vers .WAV" & vbcrlf & _
"pour un usage amical," & vbcrlf & _
"après avoir fermé cette fenêtre, " &vbcrlf & _
"draguez l'icône du fichier produit par Branleur sur ce '3dwav.vbs'" & vbcrlf & _
"Vous pouvez également donner directement ici le nom de ce fichier.")
if nom="" then wscript.quit
end if
end if ' nom ""
' ajustement
pt=0
pt=instr(pt+1,nom,".")
'msgbox pt & "?" & nom
while pt>0
p2=pt
pt=instr(pt+1,nom,".")
'msgbox "pt=" & pt & vbcrlf & "p2=" & p2 & vbcrlf & nom
wend
nextnom=mid(nom,1,p2)& frequence
'msgbox nextnom
towav nom,nextnom
sub towav(branleur,nomfo)
set fi=fs.opentextfile(branleur,1)
set fo=fs.createtextfile(nomfo& ".wav",true)
set flog=fs.createtextfile(nomfo& ".log",true)
' compter les points
nbpts=0
datedeb=""
while not fi.atendofstream
lu=ucase(fi.readline)
if instr(lu,"@@")=1 then
if datedeb="" then datedeb=lu
datefin=lu
end if
wend
fi.close
' msgbox datedeb & vbcrlf & datefin
dd=dpo(datedeb)
df=dpo(datefin)
flog.writeline "dd df " & datedeb & " " & datefin
flog.writeline "dd df " & dd & " " & df
el=datediff("s",dd,df)
flog.writeline "dd df el " & vbcrlf & dd & vbcrlf & df & vbcrlf & el
nbsec=el
nbpts=nbsec*frequence
'msgbox "créneau enregistrement" & vbcrlf & nbpts & vbcrlf & dd & " " & mid(datedeb,ideb+1,14) & vbcrlf & da & vbcrlf & df & vbcrlf & nbsec & vbcrlf & "nbpts=" & nbpts
flog.writeline "créneau enregistrement" & vbcrlf & nbpts & vbcrlf & dd & " " & mid(datedeb,ideb+1,14) & vbcrlf & da & vbcrlf & df & vbcrlf & nbsec & vbcrlf & "nbpts=" & nbpts
' deuxième passage
set fi=fs.opentextfile(branleur,1)
nbrcanaux=5
nbbytes=1
lontot=nbpts*nbbytes*nbrcanaux
a4="RIFF"
lon=44+lontot
wave="WAVE"
fmt="fmt "
bloc=16
audioformat=1
bytepersec=frequence*6
byteperbloc=nbrcanaux*nbbytes
bitspersample=8 ' 16
data="data"
datasize=lontot
wa 4,a4
wi 4,lon-datasize
wa 4,wave
wa 4,fmt
wi 4,bloc
wi 2,audioformat
wi 2,nbrcanaux
wi 4,frequence
wi 4, bytepersec
wi 2,byteperbloc
wi 2,bitspersample
wa 4,data
wi 4,datasize
nbtop=0
millipre=0
pas=(1000\frequence)
' pour ajouster sortie donner date en format YYYYMMDD-HHMMSS
dd=""
write=false
rattrapper=0
pan=true
while not fi.atendofstream
lu=ucase(fi.readline) & " "
if prtlu then flog.writeline lu
if left(lu,3)="#@@" then
write=true
flog.writeline " write fait"
end if
if left(lu,2)="@@" and instr(lu,".")=0 then
' calculer écrat de date
df=dpo(lu)
if dd<>"" then
el=datediff("s",dd,df)
millipre=1000
millipre=millipre-1000*el
end if
dd=df
end if
'
lusave=lu
if instr(lu,"#")=0 and instr(lu,"@")=0 and (lupre<>"") and len(trim(lu))>0 then
' msgbox "accepte:" & vbcrlf & lu
nbliused=nbliused+1
'intercepter milli
milli=mid(lu,1,3)
' et le retard
if write then
iret=instr(lu,">")
retard=mid(lu,iret+1)
if retard>50 and not pan then
rattrapper=retard-50
flog.writeline " write false rattraper:" & rattrapper
end if
write=false
pan=false
end if
if rattrapper>50 then
milli=milli-rattrapper
rattrapper=rattrapper-50
flog.writeline " milli=" & milli
end if
' flog.writeline milli & " " & millipre & vbcrlf & lusave
lu=mid(lu,instr(lu," ")+1)
doun
' millipre=milli-perdu+pas
lupre=lusave
end if
if instr(lusave,"#")=0 and instr(lusave,"@@")=0 then lupre=lusave
wend ' eof
fo.close
flog.writeline "pour: " & nomfo & vbcrlf & _
" nbtop=" & nbtop & " nbg=" & nbg & vbcrlf & _
"termine:" & a4 & " lontot=" & lon+8 & vbcrlf & _
"bloc:" & bloc & vbcrlf & _
"AudioFormat=" & audioformat & vbcrlf & _
"Nbrcanaux:"&nbrcanaux & vbcrlf & _
"Frequence:" & frequence & vbcrlf & _
"BytePerSec:" & bytepersec & vbcrlf & _
"BytePerBloc" & byteperbloc & vbcrlf & _
"BitsparSample:" & bitspersample & vbcrlf & vbcrlf & _
"data:" & data & vbcrlf & _
"dataSize:" & datasize &vbcrlf & _
"nbechantillonparbit:" & nbechantillonparbit & vbcrlf & _
"nbhzplus:" & nbhzplus & vbcrlf & _
"nbhzmoins:" & nbhzmoins & vbcrlf & _
"nbsecplus:" & nbsecplus & vbcrlf & _
"nbc:" & nbc & vbcrlf & _
"Nbliused: " & nbliused & vbcrlf & _
"ouf"
flog.close
end sub
function dpo(d)
ideb=instr(d,"@@")
x=mid(d,ideb+2)
dpo=mid(x,7,2) & "/" & mid(x,5,2) & "/" &mid(x,1,4) & " " & mid(x,10,2) & ":" & mid(x,12,2) & ":" &mid(x,14,2)
end function
sub doun
' flog.writeline "doun" & " " & lu & " " & millipre & " " & milli
perdu=milli-millipre ' au cas ou aucun point!
lu=lu & " 0.0 "
x=f1
y=f1
z=f1
m=sqr(x*x+y*y+z*z) ' v1
d=sqr( (x-xp)*(x-xp)+(y-yp)*(y-yp)+(z-zp)*(z-zp))
xp=x
yp=y
zp=z
' msgbox "xyz=" & vbcrlf & x & vbcrlf & y & vbcrlf & z & vbcrlf & m
xc=o1(x)
yc=o1(y)
zc=o1(z)
mc=o1(m)
dc=o1(d)
ela=(-millipre+milli)
'flog.writeline "mmp ela -" & millipre & " +" & milli & " =" & ela
nb=ela\pas
' flog.writeline nbg & ":" & millipre & " à " & milli & " =" & nb & " " & x & " " & y & " " & z & " " & m & " " & d
if millipre<milli then
for echantillon=millipre to milli-1 step pas
nbg=nbg+1
perdu=milli-echantillon
fo.write xc & yc & zc & mc & dc
' flog.writeline nbg & ":" & echantillon
millipre=echantillon+pas
next
else
flog.writeline nbg & " rien "
millipre=millipre-pas
end if
nbtop=nbtop+1
'flog.writeline "report " & perdu
end sub
function o1(xyz)
' msgbox lu & vbcrlf & xyz
ixyz=128+int(10*xyz)
if ixyz>255 then ixyz=255
if ixyz<0 then ixyz=0
o1=chr(ixyz)
end function
function f1
luori=lu
lu=trim(lu)
ji=instr(lu+" "," ")
motpoint= mid(lu,1,ji)
lu=trim(mid(lu,ji+1))
motvirgule=""
for iii=1 to len(motpoint)-1
cun=mid(motpoint,iii,1)
if cun="." then cun=","
motvirgule=motvirgule & cun
if cun<>"," and cun<>"-" then if cun<"0" or cun>"9" then msgbox "erreur " & cun & " '" & motpoint & "'" & vbcrlf & lu
next ' iii
'msgbox "w1" & vbcrlf & lu & vbcrlf & lulu & vbcrlf & motvirgule & vbcrlf & "'" & motpoint & "'"
if len(motvirgule)=0 then msgbox "vide" & vbcrlf & lu
xyz=motvirgule
' msgbox lu & vbcrlf & xyz
f1=xyz
end function
sub wa(lon,quoi)
' msgbox "ecrire " & quoi
for ip=1 to lon
fo.write(mid(quoi,ip,1))
next
end sub
function a(lon)
rw=""
for ip=1 to lon
r1=fi.read(1)
rw=rw & r1
next
a=rw
end function
sub wi(lon,quoi)
'flog.writeline "quoi=" & quoi
ww=quoi
for ip=1 to lon
q=ww\256
u=ww-256*q
' msgbox ww & " " & q & " " & u
if u<0 then u=256+u
fo.write(chr(u))
ww=q
next
end sub
function i(lon)
rw=0
m=1
for ip=1 to lon
r1=fi.read(1)
rw=rw +asc(r1)*m
m=256*m
next
i=rw
end function
exemple de fichier "light"
#Hot start @20120208_103400
#data:20120208_103400
@@20120208_100000
#on create not initialized
#Branleur, version:0.5.6.7 (20120207-0800)
#save @20120208_103400.329
#@@20120208_103400.415 e:1328693640415|u:84 size:0
#top ms DeltaMss Stamp GD AA HB [module] ~combi
@20120208_103400 Start button
#startCapture @20120208_103400 ui
#onStart @20120208_103400 0/0
#onResume @20120208_103400
667 -1.37 4.29 7.96 >1328693640667
723 -1.37 4.13 7.96 >56
764 -1.53 4.29 7.96 >41
813 -1.22 3.98 7.81 >49
863 -1.37 4.13 8.42 >50
914 -1.53 4.29 7.81 >51
963 -1.37 4.13 7.96 >49
@@20120208_103401
013 -1.37 4.29 8.12 >50
063 -1.37 4.44 7.96 >50
113 -1.37 4.29 7.96 >49
163 -1.37 4.29 7.81 >50
213 -1.22 4.13 7.96 >50
303 -1.68 4.29 7.81 >90
342 -1.37 3.98 7.96 >40
392 -1.37 4.13 7.96 >50
442 -1.53 4.29 7.81 >50
492 -1.53 4.29 8.12 >50
543 -1.53 4.29 7.96 >51
596 -1.53 4.29 7.81 >53
643 -1.37 4.29 8.12 >47
742 -1.53 4.29 8.12 >99
842 -1.53 4.29 7.81 >100
884 -1.37 4.13 7.96 >42
933 -1.37 4.13 7.81 >49
983 -1.37 4.13 7.96 >50
@@20120208_103402
033 -1.37 3.98 8.12 >50
093 -1.37 4.13 7.96 >60
193 -1.37 4.13 8.12 >100
243 -1.53 3.98 7.96 >50