# your code goes here
#!/usr/bin/python
# http://w...content-available-to-author-only...l.com/features/irdisp2.htm
import numpy as N
import wave
import sys
class IrSoundFile:
def __init__( self, make, model, signal ):
self.shift = 0
dir = make + '/' + model
#`mkdir -p $dir`
self.file = wave.open( dir + '/' + signal + '.wav', 'wb' )
self.data = []
def write_data(self):
data_str = ''.join(self.data)
self.file.setparams( ( 2, 2, self.base_frequency, len( data_str ), 'NONE', 'noncompressed' ) )
self.file.writeframes(data_str)
def close(self):
self.file.close()
def add_vals(self, count, val):
counter = 0
half_base = self.base_frequency / 2
while counter < count:
if val == 1:
ir_val = 0xFF7F
if self.shift > ( half_base ):
ir_val = 0xFFFF - ir_val
else:
ir_val = 0x7FFF
#print( "IR_VAL: %d" % ( ir_val ) )
self.data.append( wave.struct.pack( '>H', ir_val ) ) # left channel
self.data.append( wave.struct.pack( '>H', ir_val ) ) # right channel
old_shift = self.shift
self.shift += self.frequency
if self.shift > self.base_frequency: # I guess this is faster than %
self.shift = self.shift - self.base_frequency
if not ( ( old_shift < half_base ) and ( self.shift < half_base ) or ( old_shift > half_base ) and ( self.shift > half_base ) ):
counter += 1
def add_pairs( self, ones, zeros ):
self.add_vals( int( ones, 16 ), 1 )
self.add_vals( int( zeros, 16 ), 0 )
sys.stdout.write( "%s %s | " % ( ones, zeros ) )
def write_ir_code( self, str ):
self.base_frequency = 44100 # the freq of the wav file
frequencies = { '006d' : 38200 / 2 } # IR freq / 2 (b/c we're using 2 of those)
codes = str.split( ' ' )
( self.frequency, sequence_1_len, sequence_2_len ) = ( frequencies[codes[1]], int( codes[2], 16 ), int( codes[3], 16 ) )
print "S1L:%d S2L:%d FRQ:%d BFRQ:%d" % ( sequence_1_len, sequence_2_len, self.frequency, self.base_frequency)
print "Writing sequence 1 240 times"
for j in range( 1, 4 ):
for i in range( 1, sequence_1_len + 1 ):
self.add_pairs( codes[i * 2 + 2], codes[i * 2 + 1 + 2] )
print "\nWriting sequence 2 one time"
for j in range( 1, 1 ):
for i in range( 1, sequence_2_len + 1 ):
self.add_pairs( codes[i * 2 + 2 + sequence_1_len], codes[i * 2 + 1 + 2 + sequence_1_len] )
print ""
self.write_data()
samsung_power_code = "0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0040 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"
samsung_volplus_code = "0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"
samsung_volminus_code = "0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e"
file = IrSoundFile( 'samsung', 'tv', 'power' )
file.write_ir_code( samsung_power_code )
file.close()
file = IrSoundFile( 'samsung', 'tv', 'volplus' )
file.write_ir_code( samsung_volplus_code )
file.close()
file = IrSoundFile( 'samsung', 'tv', 'volminus' )
file.write_ir_code( samsung_volminus_code )
file.close()
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCiMhL3Vzci9iaW4vcHl0aG9uCgojIGh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5sLmNvbS9mZWF0dXJlcy9pcmRpc3AyLmh0bQoKaW1wb3J0IG51bXB5IGFzIE4KaW1wb3J0IHdhdmUKaW1wb3J0IHN5cwoKY2xhc3MgSXJTb3VuZEZpbGU6CiAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYWtlLCBtb2RlbCwgc2lnbmFsICk6CiAgICBzZWxmLnNoaWZ0ID0gMAogICAgZGlyID0gbWFrZSArICcvJyArIG1vZGVsCiAgICAjYG1rZGlyIC1wICRkaXJgCiAgICBzZWxmLmZpbGUgPSB3YXZlLm9wZW4oIGRpciArICcvJyArIHNpZ25hbCArICcud2F2JywgJ3diJyApCiAgICBzZWxmLmRhdGEgPSBbXQoKICBkZWYgd3JpdGVfZGF0YShzZWxmKToKICAgIGRhdGFfc3RyID0gJycuam9pbihzZWxmLmRhdGEpCiAgICBzZWxmLmZpbGUuc2V0cGFyYW1zKCAoIDIsIDIsIHNlbGYuYmFzZV9mcmVxdWVuY3ksIGxlbiggZGF0YV9zdHIgKSwgJ05PTkUnLCAnbm9uY29tcHJlc3NlZCcgKSApCiAgICBzZWxmLmZpbGUud3JpdGVmcmFtZXMoZGF0YV9zdHIpCgogIGRlZiBjbG9zZShzZWxmKToKICAgIHNlbGYuZmlsZS5jbG9zZSgpCgogIGRlZiBhZGRfdmFscyhzZWxmLCBjb3VudCwgdmFsKToKICAgIGNvdW50ZXIgPSAwCiAgICBoYWxmX2Jhc2UgPSBzZWxmLmJhc2VfZnJlcXVlbmN5IC8gMgogICAgd2hpbGUgY291bnRlciA8IGNvdW50OgogICAgICBpZiB2YWwgPT0gMToKICAgICAgICBpcl92YWwgPSAweEZGN0YKICAgICAgICBpZiBzZWxmLnNoaWZ0ID4gKCBoYWxmX2Jhc2UgKToKICAgICAgICAgIGlyX3ZhbCA9IDB4RkZGRiAtIGlyX3ZhbAogICAgICBlbHNlOgogICAgICAgIGlyX3ZhbCA9IDB4N0ZGRgogICAgICAjcHJpbnQoICJJUl9WQUw6ICVkIiAlICggaXJfdmFsICkgKQogICAgICBzZWxmLmRhdGEuYXBwZW5kKCB3YXZlLnN0cnVjdC5wYWNrKCAnPkgnLCBpcl92YWwgKSApICAgICAgICAgICAgIyBsZWZ0IGNoYW5uZWwKICAgICAgc2VsZi5kYXRhLmFwcGVuZCggd2F2ZS5zdHJ1Y3QucGFjayggJz5IJywgaXJfdmFsICkgKSAgICMgcmlnaHQgY2hhbm5lbAogICAgICBvbGRfc2hpZnQgPSBzZWxmLnNoaWZ0CiAgICAgIHNlbGYuc2hpZnQgKz0gc2VsZi5mcmVxdWVuY3kKICAgICAgaWYgc2VsZi5zaGlmdCA+IHNlbGYuYmFzZV9mcmVxdWVuY3k6ICAjIEkgZ3Vlc3MgdGhpcyBpcyBmYXN0ZXIgdGhhbiAlCiAgICAgICAgc2VsZi5zaGlmdCA9IHNlbGYuc2hpZnQgLSBzZWxmLmJhc2VfZnJlcXVlbmN5CiAgICAgIGlmIG5vdCAoICggb2xkX3NoaWZ0IDwgaGFsZl9iYXNlICkgYW5kICggc2VsZi5zaGlmdCA8IGhhbGZfYmFzZSApIG9yICggb2xkX3NoaWZ0ID4gaGFsZl9iYXNlICkgYW5kICggc2VsZi5zaGlmdCA+IGhhbGZfYmFzZSApICk6CiAgICAgICAgY291bnRlciArPSAxCgogIGRlZiBhZGRfcGFpcnMoIHNlbGYsIG9uZXMsIHplcm9zICk6CiAgICBzZWxmLmFkZF92YWxzKCBpbnQoIG9uZXMsIDE2ICksIDEgKQogICAgc2VsZi5hZGRfdmFscyggaW50KCB6ZXJvcywgMTYgKSwgMCApCiAgICBzeXMuc3Rkb3V0LndyaXRlKCAiJXMgJXMgfCAiICUgKCBvbmVzLCB6ZXJvcyApICkKCgogIGRlZiB3cml0ZV9pcl9jb2RlKCBzZWxmLCBzdHIgKToKICAgIHNlbGYuYmFzZV9mcmVxdWVuY3kgPSA0NDEwMCAjIHRoZSBmcmVxIG9mIHRoZSB3YXYgZmlsZQogICAgZnJlcXVlbmNpZXMgPSB7ICcwMDZkJyA6IDM4MjAwIC8gMiB9ICMgSVIgZnJlcSAvIDIgKGIvYyB3ZSdyZSB1c2luZyAyIG9mIHRob3NlKQogICAgY29kZXMgPSBzdHIuc3BsaXQoICcgJyApCiAgICAoIHNlbGYuZnJlcXVlbmN5LCBzZXF1ZW5jZV8xX2xlbiwgc2VxdWVuY2VfMl9sZW4gKSA9ICggZnJlcXVlbmNpZXNbY29kZXNbMV1dLCBpbnQoIGNvZGVzWzJdLCAxNiApLCBpbnQoIGNvZGVzWzNdLCAxNiApICkKICAgIHByaW50ICJTMUw6JWQgUzJMOiVkIEZSUTolZCBCRlJROiVkIiAlICggc2VxdWVuY2VfMV9sZW4sIHNlcXVlbmNlXzJfbGVuLCBzZWxmLmZyZXF1ZW5jeSwgc2VsZi5iYXNlX2ZyZXF1ZW5jeSkKICAgIHByaW50ICJXcml0aW5nIHNlcXVlbmNlIDEgMjQwIHRpbWVzIgogICAgZm9yIGogaW4gcmFuZ2UoIDEsIDQgKToKICAgICAgZm9yIGkgaW4gcmFuZ2UoIDEsIHNlcXVlbmNlXzFfbGVuICsgMSApOgogICAgICAgIHNlbGYuYWRkX3BhaXJzKCBjb2Rlc1tpICogMiArIDJdLCBjb2Rlc1tpICogMiArIDEgKyAyXSApCiAgICBwcmludCAiXG5Xcml0aW5nIHNlcXVlbmNlIDIgb25lIHRpbWUiCiAgICBmb3IgaiBpbiByYW5nZSggMSwgMSApOgogICAgICBmb3IgaSBpbiByYW5nZSggMSwgc2VxdWVuY2VfMl9sZW4gKyAxICk6CiAgICAgICAgc2VsZi5hZGRfcGFpcnMoIGNvZGVzW2kgKiAyICsgMiArIHNlcXVlbmNlXzFfbGVuXSwgY29kZXNbaSAqIDIgKyAxICsgMiArIHNlcXVlbmNlXzFfbGVuXSApCiAgICBwcmludCAiIgogICAgc2VsZi53cml0ZV9kYXRhKCkKCgpzYW1zdW5nX3Bvd2VyX2NvZGUgPSAiMDAwMCAwMDZkIDAwMjIgMDAwMyAwMGE5IDAwYTggMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwM2YgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDQwIDAwMTUgMDAxNSAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDA3MDIgMDBhOSAwMGE4IDAwMTUgMDAxNSAwMDE1IDBlNmUiCgpzYW1zdW5nX3ZvbHBsdXNfY29kZSA9ICIwMDAwIDAwNmQgMDAyMiAwMDAzIDAwYTkgMDBhOCAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDcwMiAwMGE5IDAwYTggMDAxNSAwMDE1IDAwMTUgMGU2ZSIKCnNhbXN1bmdfdm9sbWludXNfY29kZSA9ICIwMDAwIDAwNmQgMDAyMiAwMDAzIDAwYTkgMDBhOCAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwMTUgMDAxNSAwMDNmIDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAxNSAwMDE1IDAwMTUgMDAzZiAwMDE1IDAwMTUgMDAxNSAwMDNmIDAwMTUgMDAzZiAwMDE1IDAwM2YgMDAxNSAwMDNmIDAwMTUgMDcwMiAwMGE5IDAwYTggMDAxNSAwMDE1IDAwMTUgMGU2ZSIKCmZpbGUgPSBJclNvdW5kRmlsZSggJ3NhbXN1bmcnLCAndHYnLCAncG93ZXInICkKZmlsZS53cml0ZV9pcl9jb2RlKCBzYW1zdW5nX3Bvd2VyX2NvZGUgKQpmaWxlLmNsb3NlKCkKCmZpbGUgPSBJclNvdW5kRmlsZSggJ3NhbXN1bmcnLCAndHYnLCAndm9scGx1cycgKQpmaWxlLndyaXRlX2lyX2NvZGUoIHNhbXN1bmdfdm9scGx1c19jb2RlICkKZmlsZS5jbG9zZSgpCgpmaWxlID0gSXJTb3VuZEZpbGUoICdzYW1zdW5nJywgJ3R2JywgJ3ZvbG1pbnVzJyApCmZpbGUud3JpdGVfaXJfY29kZSggc2Ftc3VuZ192b2xtaW51c19jb2RlICkKZmlsZS5jbG9zZSgpCgo=