Copyrighted Silence : structuration des données et métadonnées

le script RIP.py :

# -*- coding: utf-8 -*-

'''
  RIP PROCESS
  - rip current CD in drive to "CD_xxx" directory
  - create current "rip_info.xml" in "CD_XXX" directory
  - rip audio into .wav files to "waverip" subdirectory
  - update global "rip_process.xml"
'''

import pymedia.removable.cd as cd
import sys, wave, struct, os
import datetime
import lxml.etree as ET
import random

import CS_lib

# --- LOAD "rip_process.xml"
rip_process_path = os.path.normpath(CS_lib.DATAPATH+"/rip_process.xml")
parser = ET.XMLParser(remove_blank_text=True)
tree = ET.parse(rip_process_path, parser)
rip_process = tree.getroot()
cds = rip_process.findall("cd")
newCD_id = len(cds) + 1

# --- get basic info
print("Be sure to insert CD in drive...")
print("and input human readable labels below")
artistLabel = raw_input("Artist : ")
albumLabel = raw_input("Album : ")

now = datetime.datetime.now()
print("this is local time")
print(now)

# --- créer le dossier "CD_xxx" et son sous-dossier "waverip"
os.chdir(CS_lib.DATAPATH)
newCD_relDir = "CD_"+str(newCD_id)
os.mkdir(newCD_relDir)
newCD_dir = os.path.normpath(CS_lib.DATAPATH+"/"+newCD_relDir)
os.chdir(newCD_relDir)
os.mkdir("waverip")
newCD_waverip_dir = os.path.normpath(newCD_dir+"/waverip")

# --- Ouvrir le media, choisir le bon lecteur
cd.init()	
driveNo = raw_input("Choose drive no. (on "+str(cd.getCount())+" drive(s) found) : ")
if driveNo == '':
	driveNo = str(CS_lib.default_CDDriveNo)
c = cd.CD(int(driveNo))

# --- Récupérer les propriétés dont la Table Of Content (TOC), et le nombre de pistes
cd_props = c.getProperties()
print("opened cd")
newCD_tracksNb = len(cd_props['titles'])
print ("with "+str(newCD_tracksNb)+" track(s)")

currentTrackPos = 0
rip_info = ET.Element('rip_info')

# Itérer parmi les pistes
for tr_no in xrange(len(cd_props['titles'])):
	# --- ouvrir piste
	tr = c.open(cd_props['titles'][tr_no]) 
	
	# --- calcul de la durée
	tr_len_in_frames = int(cd_props['TOC'][tr_no][1])
	tr_len_in_smp = tr_len_in_frames * 588
	tr_len_min = (tr_len_in_smp / 44100) / 60
	tr_len_sec = (tr_len_in_smp / 44100) % 60
	tr_len_ms = int(((tr_len_in_smp / 44100.0) % 1.0) * 1000)
	
	# --- affichage données de piste
	print '--- TRACK %s ---' % (tr_no + 1)
	print '%s frames = %s samples' % (tr_len_in_frames, tr_len_in_smp) 
	print '%s\'%s\":%s' % (tr_len_min, tr_len_sec, tr_len_ms)
	
	
	# --- création du .wav et extraction des données vers fichier
	wavefile_path = os.path.normpath(newCD_waverip_dir+"/TR_"+str(tr_no+1)+".wav")
	wfile = wave.open(wavefile_path, 'w')
	wfile.setparams((2, 2, 44100, 0, 'NONE', 'not compressed'))
	wfile.writeframes(tr.read(tr_len_in_smp * 4))
	wfile.close()
	tr.close()

	# --- ajout des données pour rip_info
	track_info = ET.SubElement(rip_info, 'track', id=str(tr_no+1))
	track_length = ET.SubElement(track_info, 'length_in_smp')
	track_length.text = str(tr_len_in_smp)
	track_position = ET.SubElement(track_info, 'position_in_smp')
	track_position.text = str(currentTrackPos)
	currentTrackPos += tr_len_in_smp

# --- fin du rip, éjection du CD	
c.eject()

# --- Enregistrer "rip_info.xml"
xmlstring = ET.tostring(rip_info, pretty_print=True)
rip_info_path = os.path.normpath(newCD_dir+"/rip_info.xml")
output = open(rip_info_path, 'w')
output.write(xmlstring)
output.close()
print "rip_info.xml created"


# --- mettre à jour rip_process
newCD = ET.Element("cd", attrib={'id':str(newCD_id)})
artist = ET.SubElement(newCD, 'artist')
artist.text = artistLabel
album = ET.SubElement(newCD, 'album')
album.text = albumLabel
rip_date = ET.SubElement(newCD, 'rip_date')
now = datetime.datetime.now()
rip_date.text = now.strftime("%Y-%m-%d %H:%M:%S")
tracksNb = ET.SubElement(newCD, 'tracksNb')
tracksNb.text = str(newCD_tracksNb)

rip_process.append(newCD)

#xmlstring = CS_lib.prettify(rip_process)
xmlstring = ET.tostring(rip_process, pretty_print=True)
output = open(rip_process_path, 'w')
output.write(xmlstring)
output.close()
print "rip_process.xml updated"

 

le fichier ./rip_process.xml :

<rip_process>
  <cd id="1">
    <artist>Margo</artist>
    <album>Furtive Furies</album>
    <rip_date>2015-09-16 23:53:10</rip_date>
    <tracksNb>13</tracksNb>
  </cd>
  <cd id="2">
    <artist>Motorhead</artist>
    <album>Dirty Love</album>
    <rip_date>2015-09-16 23:59:39</rip_date>
    <tracksNb>11</tracksNb>
  </cd>
  <cd id="3">
    <artist>Portishead</artist>
    <album>Portishead</album>
    <rip_date>2015-09-17 00:06:08</rip_date>
    <tracksNb>11</tracksNb>
  </cd>
  <cd id="4">
    <artist>Laurie Anderson</artist>
    <album>Bright Red</album>
    <rip_date>2015-09-17 00:49:39</rip_date>
    <tracksNb>14</tracksNb>
  </cd>
  <cd id="5">
    <artist>MIS (Mexican Institute of Sound)</artist>
    <album>Politico</album>
    <rip_date>2015-09-17 01:01:02</rip_date>
    <tracksNb>13</tracksNb>
  </cd>
  <cd id="6">
    <artist>Robert Wyatt</artist>
    <album>Rock Bottom</album>
    <rip_date>2015-09-17 01:43:47</rip_date>
    <tracksNb>6</tracksNb>
  </cd>
  <cd id="7">
    <artist>KMFDM</artist>
    <album>WWIII</album>
    <rip_date>2015-09-17 01:51:50</rip_date>
    <tracksNb>11</tracksNb>
  </cd>
</rip_process>

 

exemple d’un fichier ./CD_xxx/rip_info.xml :

<rip_info>
  <track id="1">
    <length_in_smp>7952700</length_in_smp>
    <position_in_smp>0</position_in_smp>
  </track>
  <track id="2">
    <length_in_smp>11660628</length_in_smp>
    <position_in_smp>7952700</position_in_smp>
  </track>
  <track id="3">
    <length_in_smp>14457156</length_in_smp>
    <position_in_smp>19613328</position_in_smp>
  </track>
  <track id="4">
    <length_in_smp>10254132</length_in_smp>
    <position_in_smp>34070484</position_in_smp>
  </track>
  <track id="5">
    <length_in_smp>12640236</length_in_smp>
    <position_in_smp>44324616</position_in_smp>
  </track>
  <track id="6">
    <length_in_smp>8336076</length_in_smp>
    <position_in_smp>56964852</position_in_smp>
  </track>
  <track id="7">
    <length_in_smp>8220828</length_in_smp>
    <position_in_smp>65300928</position_in_smp>
  </track>
  <track id="8">
    <length_in_smp>15575532</length_in_smp>
    <position_in_smp>73521756</position_in_smp>
  </track>
  <track id="9">
    <length_in_smp>10181808</length_in_smp>
    <position_in_smp>89097288</position_in_smp>
  </track>
  <track id="10">
    <length_in_smp>7172424</length_in_smp>
    <position_in_smp>99279096</position_in_smp>
  </track>
  <track id="11">
    <length_in_smp>9042852</length_in_smp>
    <position_in_smp>106451520</position_in_smp>
  </track>
  <track id="12">
    <length_in_smp>13088880</length_in_smp>
    <position_in_smp>115494372</position_in_smp>
  </track>
  <track id="13">
    <length_in_smp>32832156</length_in_smp>
    <position_in_smp>128583252</position_in_smp>
  </track>
</rip_info>

 

plagiat audio : quelques liens

FORUM « SAMPLES »

http://saceml.deepsound.net/archives/archi3.html

http://saceml.deepsound.net/archives/archi4.html

http://saceml.deepsound.net/archives/archi75.html

ARTICLES « SAMPLES »

http://www.konbini.com/fr/entertainment-2/sampling-et-droits-dauteur/

https://en.wikipedia.org/wiki/Legal_issues_surrounding_music_sampling

https://fr.wikipedia.org/wiki/%C3%89chantillon_%28musique%29#Questions_juridiques

 

python wave

bases en python >>> FLOSS Manual : Initiation à Python >>> http://www.flossmanualsfr.net/initiation-a-python/

la librairie « wave » assez simple d’utilisation : https://docs.python.org/2/library/wave.html

premier tests sous python :

# -*- coding:utf-8 -*-

import wave, struct

sndfile = wave.open("Lusitania.wav",  'r')
print sndfile.getparams()
sndfile.setpos(48200)
frames = sndfile.readframes(12)
print(len(frames))

i = 0
while i < len(frames):
        oneframe = frames[i:i+2]
        print(len(oneframe))
        data = struct.unpack("<h", oneframe)
        print(data)
        i+= 2

sndfile.close()

également la librairie externe PyMedia (http://www.pymedia.org) qui permet de lire directement un CD Audio

à noter les spécificités du CD Audio (voir notamment https://en.wikipedia.org/wiki/Compact_Disc_Digital_Audio#Frames_and_timecode_frames) : il semblerait que, au moins dans la TOC (Table Of Content) les durées et positions soient inscrites en « frames » de 588 paire d’échantillons (gauche et droite) soit 1/75e de seconde (588 x 75 = 44100). Donc il s’agit du « grain », de l’unité minimale de durée.
(à vérifier tout de même avec un autre outil (par ex : rip puis pd [soundfiler] voir si on a des durées qui ne sont pas multiples de 588)

également à propos du format WAVE : un bon document >> http://web.archive.org/web/20080113195252/http://www.borg.com/~jglatt/tech/wave.htm