Exemplo n.º 1
0
def add_new_song(song_name):
    song_featured_artist = input('Enter song artist: ')
    song_released_date = input('Enter song released date: ')
    song_duration = input('Enter song duration: ')
    song_band_name_1 = input('Enter song band name 1: ')
    song_band_name_2 = input('Enter song band name 2: ')
    bands_name = [song_band_name_1, song_band_name_2]
    song_type = input('Enter song type(Single/In Album): ')
    song_genre = input('Enter song genre: ')
    song_lyrics = input('Enter song lyrics: ')
    song_playlist = input('Enter song playlist name: ')
    new_song = None
    if song_type == 'Single' or song_type == 'single':
        new_song = Song(song_name, song_featured_artist, bands_name,
                        song_playlist, song_type, song_released_date,
                        song_genre, song_lyrics, song_duration)
    else:
        song_album_title = input('Enter song album title: ')
        new_song = InAlbum(song_name, song_featured_artist, song_album_title,
                           bands_name, song_playlist, song_type,
                           song_released_date, song_genre, song_lyrics,
                           song_duration)
    result = song_controller.add_song(new_song)
    if result == 'error':
        'Error:  Please enter a valid song features.'
    view_library()
def grabSongsDetailFromPage(url):
    print("requests:" + url)
    page = requests.get(url)
    tree = html.fromstring(page.content)
    textContacts = tree.xpath('//div[@class="textcontact-music"]')
    songs = []
    for detail in textContacts:
        title, artist, album, record, category, genre = "", "", "", "", "", ""
        for a in detail:
            href = a.get("href")
            if href is not None and ".html" in href:
                if "artist" in href:
                    artist = a.text
                elif "album" in href:
                    album = a.text
                elif "recording" in href:
                    record = a.text
                elif "category" in href:
                    category = a.text
                elif "genre" in href:
                    genre = a.text
                else:
                    title = a.text
        songs.append(Song(title, artist, album, record, category, genre))
    return songs
Exemplo n.º 3
0
    def menu_import_seq24(self, widget, data=None):
        


        filename = self.file_dialog('import_seq24')
        if filename:                
            imported_song = Song()
            event_handler = midifile.NoteOnPrinter()
            event_handler.set_song(imported_song)
            midi_in = midifile.MidiInFile(event_handler, filename)
            midi_in.read()

            for pattern in imported_song.get_patterns():
                self.song.add_pattern(pattern)
                PatternWidget(self, pattern)
                
            self.filename = filename
            self.refresh_channels()
            self.save_state = False
def save_song_to_db(song, db):
    """
    Save song in database
    """
    try:
        cursor = db.cursor()

        song_name = song.name
        artists = song.artists
        lyrics = song.lyrics
        album_name = song.album
        source = song.source
        poster_url = song.image_link
        mp3_links = song.mp3_links
        release_date = song.released_date
        youtube_id = song.youtube_id
        genres = song.genres
        album_id = None
        artist_ids = []

        if album_name is not None:
            album_id = Album(album_name).insert(cursor).id

        for artist in (artists or [{'name': None, type: None}]):
            artist_id = Artist(artist['name'], artist['type']) \
                        .insert(cursor).id

            if artist['type'] == 'singer':
                artist_ids.append(artist_id)

        song_id = Song(song_name,
                       lyrics,
                       album_id,
                       poster_url,
                       release_date,
                       youtube_id,
                       artist_ids=artist_ids).insert(cursor).id

        for artist_id in artist_ids:
            SongArtist(song_id, artist_id).insert(cursor)

        if genres:
            for genre in genres:
                genre_id = Genre(genre).insert(cursor).id
                SongGenre(song_id, genre_id).insert(cursor)

        for quality in mp3_links:
            url = mp3_links.get(quality)
            Mp3s(song_id, url, source, quality).insert(cursor)

        db.commit()
    except IOError as error:
        print("Error while inserting new song", error)
def save_rankings_to_db(ranking, app):
    """
    Save ranking in song_rankings table
    """
    db = get_db(app)

    try:
        cursor = db.cursor()

        for rank in ranking:
            song_name = rank.name
            artist_name = rank.artist
            youtube_id = rank.youtube_id
            source = rank.source
            song_rank = rank.ranking
            week = rank.week
            genre = rank.genre
            artist_ids = []

            for artist in artist_name:
                artist_id = Artist(artist, 'singer') \
                        .insert(cursor).id

                artist_ids.append(artist_id)

            song_id = Song(song_name,
                           None,
                           None,
                           None,
                           None,
                           youtube_id,
                           artist_ids=artist_ids).insert(cursor).id

            genre_id = Genre(genre).insert(cursor).id
            SongGenre(song_id, genre_id).insert(cursor)

            for artist_id in artist_ids:
                SongArtist(song_id, artist_id).insert(cursor)

                SongRankings(
                    song_id,
                    artist_id,
                    source,
                    song_rank,
                    week,
                ).insert(cursor)
    except IOError as error:
        print('Error while inserting new ranking ', error)
    finally:
        db.commit()
        db.close()
Exemplo n.º 6
0
 def new_file(self, widget, data=None):
     if self.save_state:
         response = gtk.RESPONSE_YES
     else:
         dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL , gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
                 "Create new song?\nUnsaved changes will be lost.")
                 
         response = dialog.run()
         dialog.destroy()
     
     if response == gtk.RESPONSE_YES:
         self.vbox_patterns.foreach(self.vbox_patterns.remove)
         self.song = Song()
         self.song.add_channel()
         self.refresh_channels()
         self.filename = ''
         self.save_state = True
Exemplo n.º 7
0
    def map_result_set_to_list_of_objects(self, result_set):
        list_of_songs = []
        for row in result_set:
            type_of_my_song = row[6]
            name = row[0]
            featured_artist = row[1]
            if row[2] == None:
                album_title = ''
            else:
                album_title = row[2]
            bands_name = ['', '']
            if row[3] == None:
                if row[4] == None:
                    bands_name = ['', '']
            elif row[4] == None:
                bands_name = [row[3], '']
            else:
                bands_name = [row[3], row[4]]
            if row[5] == None:
                playlist_name = ''
            else:
                playlist_name = row[5]

            song_type = row[6]
            released_date = row[7]
            genre = row[8]
            if row[9] == None:
                lyrics = ''
            else:
                lyrics = row[9]
            duration = row[10]
            if type_of_my_song == 'Single' or type_of_my_song == 'single':
                """
                my_song = Song(row[0], row[1], [row[3], row[4]],
                               row[5], row[6], row[7], row[8], row[9], row[10])"""
                my_song = Song(name, featured_artist, bands_name,
                               playlist_name, song_type, released_date, genre,
                               lyrics, duration)
            else:
                my_song = InAlbum(name, featured_artist, album_title,
                                  bands_name, playlist_name, song_type,
                                  released_date, genre, lyrics, duration)
            list_of_songs.append(my_song)
        return list_of_songs
Exemplo n.º 8
0
 def get_song(self, song_name):
     connection = sqlite3.connect("musicly.db")
     cur = connection.cursor()
     row = None
     try:
         connection.row_factory = sqlite3.Row
         sqlStatement = 'SELECT * FROM SONG WHERE NAME=?'
         cur.execute(sqlStatement, (song_name, ))
         row = cur.fetchone()
     except Exception as ex:
         print("There Is An Exception.")
     connection.close()
     # return SongController.map_to_song_object(row)
     my_song = None
     type_of_my_song = row[6]
     if type_of_my_song == 'Single':
         my_song = Song(row[0], row[1], [row[3], row[4]], row[5], row[6],
                        row[7], row[8], row[9], row[10])
     else:
         my_song = InAlbum(row[0], row[1], row[2], [row[3], row[4]], row[5],
                           row[6], row[7], row[8], row[9], row[10])
     return my_song
                elif "recording" in href:
                    record = a.text
                elif "category" in href:
                    category = a.text
                elif "genre" in href:
                    genre = a.text
                else:
                    title = a.text
        songs.append(Song(title, artist, album, record, category, genre))
    return songs


if __name__ == "__main__":
    with open("songsList2.csv", 'w', newline='', encoding='utf-8') as csv_file:
        wr = csv.writer(csv_file, delimiter=',', quoting=csv.QUOTE_ALL)
        songs = [
            Song("title", "artist", "album", "record", "category", "genre")
        ]
        # songs = grabSongsDetailFromPage("https://musicstation.kapook.com/genre.html?v=%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%97%E0%B8%B8%E0%B9%88%E0%B8%87-%E0%B9%80%E0%B8%9E%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95&page=1")
        # print(songs)
        for page in range(1, 109):
            songs += grabSongsDetailFromPage(
                "https://musicstation.kapook.com/genre.html?v=%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%97%E0%B8%B8%E0%B9%88%E0%B8%87-%E0%B9%80%E0%B8%9E%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%8A%E0%B8%B5%E0%B8%A7%E0%B8%B4%E0%B8%95&page="
                + page.__str__())
        for page in range(1, 386):
            songs += grabSongsDetailFromPage(
                "https://musicstation.kapook.com/genre.html?v=%E0%B9%84%E0%B8%97%E0%B8%A2&page="
                + page.__str__())
        for cdr in songs:
            wr.writerow(cdr.getDetailCSV())
Exemplo n.º 10
0
    def __init__(self):
        gtk.Window.__init__(self)

        self.conf = Config.Config()

        #MIDI Connections Object
        self.conn = Connections()
        if 'input_device' in self.conf.value:
            self.conn.change_input_device(self.conf.value['input_device'])
            
        self.player = PlayerThreadSong(self.conn)
        self.player.start()
        self.player_pattern = PlayerThread(self.conn)
        self.player_pattern.start()

        self.set_title("Desfonema Sequencer " + VERSION)
        self.set_icon_from_file("dseq.png")
        self.filename = ''

        self.song = Song()

        self.set_default_size(900,500)
        self.set_size_request(900,500)
        
        #Close, destroy!
        self.connect("delete_event", self.quit_program)

        # A vBox to contain my own drawing and a menu
        vbox = gtk.VBox(False, 0)

        #File Menu (much like seq24)
        file_menu = gtk.MenuItem("_File")

        # We create the menu widget
        menu = gtk.Menu()
        
        #And keyboard Shortcuts
        accel_group = gtk.AccelGroup()
        self.add_accel_group(accel_group)

        #New Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_NEW)
        menu_items.connect('activate', self.new_file)
        menu_items.add_accelerator("activate", accel_group, ord('N'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Open Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_OPEN)
        menu_items.connect('activate', self.menu_open)
        menu_items.add_accelerator("activate", accel_group, ord('O'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        separator = gtk.SeparatorMenuItem()
        separator.show()
        menu.append(separator)

        #Save Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_SAVE)
        menu_items.connect('activate', self.menu_save)
        menu_items.add_accelerator("activate", accel_group, ord('S'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Save As Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS)
        menu_items.connect('activate', self.menu_save_as)
        menu_items.add_accelerator("activate", accel_group, ord('A'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Import Patterns
        menu_items = gtk.MenuItem('_Import Patterns...')
        menu_items.connect('activate', self.menu_import_patterns)
        menu_items.add_accelerator("activate", accel_group, ord('I'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Seq24 Import
        menu_items = gtk.MenuItem('Import Seq24 Sequences...')
        menu_items.connect('activate', self.menu_import_seq24)
        menu.append(menu_items)
        menu_items.show()

        separator = gtk.SeparatorMenuItem()
        separator.show()
        menu.append(separator)

        #Quit Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_QUIT)
        menu_items.connect('activate', self.quit_program)
        menu.append(menu_items)
        menu_items.show()

        file_menu.set_submenu(menu)
        file_menu.show()

        #Song Menu 
        song_menu = gtk.MenuItem("_Song")

        # We create the menu widget
        menu = gtk.Menu()

        #Add Pattern Menu
        menu_items = gtk.MenuItem('Add _Pattern')
        menu_items.connect('activate', self.add_pattern)
        menu_items.add_accelerator("activate", accel_group, ord('P'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Paste Pattern Menu
        menu_items = gtk.MenuItem('Paste Pattern')
        menu_items.connect('activate', self.paste_pattern)
        menu_items.add_accelerator("activate", accel_group, ord('V'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Add Channel Menu
        menu_items = gtk.MenuItem('Add _Channel')
        menu_items.connect('activate', self.add_channel)
        menu_items.add_accelerator("activate", accel_group, ord('C'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        #menu_items.show()

        song_menu.set_submenu(menu)
        song_menu.show()
        
        # Create a menu-bar to hold the menus and add it to our main window
        menu_bar = gtk.MenuBar()
        menu_bar.append(file_menu)
        menu_bar.append(song_menu)
        menu_bar.show()
        
        #Add menubar to the VBox
        vbox.pack_start(menu_bar, False, False, 2)

        #ToolBox

        hbox_toolbox = gtk.HBox(False, 0)

        #Pattern Tools
        btn_create_pattern = gtk.Button('Add Pattern')
        btn_create_pattern.connect("clicked", self.add_pattern)
        btn_create_pattern.show()
        hbox_toolbox.pack_start(btn_create_pattern, False, False, 0)

        btn_paste_pattern = gtk.Button('Paste Pattern')
        btn_paste_pattern.connect("clicked", self.paste_pattern)
        btn_paste_pattern.show()
        hbox_toolbox.pack_start(btn_paste_pattern, False, False, 0)

        #BPM/Position
        lbl_bpm = gtk.Label("Bpm:")
        lbl_bpm.show()
        hbox_toolbox.pack_start(lbl_bpm, False, False, 0)
        self.adj_bpm = gtk.Adjustment(value=self.song.get_bpm(), lower=45, upper=240, step_incr=1)
        self.adj_bpm.connect("value_changed", self.adj_bpm_changed)
        spn_bpm = gtk.SpinButton(self.adj_bpm, 0, 0)
        spn_bpm.show()        
        hbox_toolbox.pack_start(spn_bpm, False, False, 4)

        lbl_pos = gtk.Label("Pos:")
        lbl_pos.show()
        hbox_toolbox.pack_start(lbl_pos, False, False, 0)
        self.adj_pos = gtk.Adjustment(value=self.player.get_pos(), lower=0, upper=999, step_incr=1)
        self.adj_pos.connect("value_changed", self.adj_pos_changed)
        spn_pos = gtk.SpinButton(self.adj_pos, 0, 0)
        spn_pos.show()        
        hbox_toolbox.pack_start(spn_pos, False, False, 4)

        btn_play_song = gtk.Button('Play Song')
        btn_play_song.connect("clicked", self.btn_play_song_clicked)
        btn_play_song.show()
        
        hbox_toolbox.pack_start(btn_play_song, False, False, 0)

        hbox_toolbox.show()
        
        vbox.pack_start(hbox_toolbox, False, False, 2)

        # Song items (patterns and channels)
        hpaned_song = gtk.HPaned()

        # Patterns
        frame = gtk.Frame('Patterns')
        frame.set_size_request(700,400)
        #Scroll, to see complete Pattern List
        sw = gtk.ScrolledWindow()

        self.vbox_patterns = gtk.VBox(False, 0)
        self.vbox_patterns.show()

        sw.add_with_viewport(self.vbox_patterns)
        
        sw.show()
        
        frame.add(sw)
        frame.show()
        hpaned_song.add1(frame)
        
        # Channels
        frame = gtk.Frame('Song')
        vbox_channels = gtk.VBox(False,0)

        #Scroll, to see complete Song
        sw = gtk.ScrolledWindow()

        self.hbox_channels = gtk.HBox(False, 0)
        self.hbox_channels.show()
        
        sw.add_with_viewport(self.hbox_channels)
        
        sw.show()
        vbox_channels.pack_start(sw, True, True, 0)
        
        vbox_channels.show()

        frame.add(vbox_channels)
        frame.show()
        
        hpaned_song.add2(frame)

        hpaned_song.show()
        vbox.pack_start(hpaned_song, True, True, 0)


        channels = self.song.get_channels()
        if len(channels): 
            channel = channels[0]
        else:
            channel = self.song.add_channel()
        
        ChannelWidget(self, channel)

        channels = self.song.get_channels()

        if len(channels) == 0:
            return
            
        channel = channels[0]

        #self.player.set_pos(int(self.adj_pos.get_value()))
        self.player.set_data(channel)
        self.player.set_bpm(self.song.get_bpm())
        #self.playing_pos = gobject.timeout_add(500, self.update_playing_pos)

        vbox.show()
        self.add(vbox)
        self.save_state = True
Exemplo n.º 11
0
class SongWindow(gtk.Window):

    def __init__(self):
        gtk.Window.__init__(self)

        self.conf = Config.Config()

        #MIDI Connections Object
        self.conn = Connections()
        if 'input_device' in self.conf.value:
            self.conn.change_input_device(self.conf.value['input_device'])
            
        self.player = PlayerThreadSong(self.conn)
        self.player.start()
        self.player_pattern = PlayerThread(self.conn)
        self.player_pattern.start()

        self.set_title("Desfonema Sequencer " + VERSION)
        self.set_icon_from_file("dseq.png")
        self.filename = ''

        self.song = Song()

        self.set_default_size(900,500)
        self.set_size_request(900,500)
        
        #Close, destroy!
        self.connect("delete_event", self.quit_program)

        # A vBox to contain my own drawing and a menu
        vbox = gtk.VBox(False, 0)

        #File Menu (much like seq24)
        file_menu = gtk.MenuItem("_File")

        # We create the menu widget
        menu = gtk.Menu()
        
        #And keyboard Shortcuts
        accel_group = gtk.AccelGroup()
        self.add_accel_group(accel_group)

        #New Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_NEW)
        menu_items.connect('activate', self.new_file)
        menu_items.add_accelerator("activate", accel_group, ord('N'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Open Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_OPEN)
        menu_items.connect('activate', self.menu_open)
        menu_items.add_accelerator("activate", accel_group, ord('O'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        separator = gtk.SeparatorMenuItem()
        separator.show()
        menu.append(separator)

        #Save Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_SAVE)
        menu_items.connect('activate', self.menu_save)
        menu_items.add_accelerator("activate", accel_group, ord('S'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Save As Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS)
        menu_items.connect('activate', self.menu_save_as)
        menu_items.add_accelerator("activate", accel_group, ord('A'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Import Patterns
        menu_items = gtk.MenuItem('_Import Patterns...')
        menu_items.connect('activate', self.menu_import_patterns)
        menu_items.add_accelerator("activate", accel_group, ord('I'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Seq24 Import
        menu_items = gtk.MenuItem('Import Seq24 Sequences...')
        menu_items.connect('activate', self.menu_import_seq24)
        menu.append(menu_items)
        menu_items.show()

        separator = gtk.SeparatorMenuItem()
        separator.show()
        menu.append(separator)

        #Quit Menu
        menu_items = gtk.ImageMenuItem(gtk.STOCK_QUIT)
        menu_items.connect('activate', self.quit_program)
        menu.append(menu_items)
        menu_items.show()

        file_menu.set_submenu(menu)
        file_menu.show()

        #Song Menu 
        song_menu = gtk.MenuItem("_Song")

        # We create the menu widget
        menu = gtk.Menu()

        #Add Pattern Menu
        menu_items = gtk.MenuItem('Add _Pattern')
        menu_items.connect('activate', self.add_pattern)
        menu_items.add_accelerator("activate", accel_group, ord('P'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Paste Pattern Menu
        menu_items = gtk.MenuItem('Paste Pattern')
        menu_items.connect('activate', self.paste_pattern)
        menu_items.add_accelerator("activate", accel_group, ord('V'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        menu_items.show()

        #Add Channel Menu
        menu_items = gtk.MenuItem('Add _Channel')
        menu_items.connect('activate', self.add_channel)
        menu_items.add_accelerator("activate", accel_group, ord('C'), gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
        menu.append(menu_items)
        #menu_items.show()

        song_menu.set_submenu(menu)
        song_menu.show()
        
        # Create a menu-bar to hold the menus and add it to our main window
        menu_bar = gtk.MenuBar()
        menu_bar.append(file_menu)
        menu_bar.append(song_menu)
        menu_bar.show()
        
        #Add menubar to the VBox
        vbox.pack_start(menu_bar, False, False, 2)

        #ToolBox

        hbox_toolbox = gtk.HBox(False, 0)

        #Pattern Tools
        btn_create_pattern = gtk.Button('Add Pattern')
        btn_create_pattern.connect("clicked", self.add_pattern)
        btn_create_pattern.show()
        hbox_toolbox.pack_start(btn_create_pattern, False, False, 0)

        btn_paste_pattern = gtk.Button('Paste Pattern')
        btn_paste_pattern.connect("clicked", self.paste_pattern)
        btn_paste_pattern.show()
        hbox_toolbox.pack_start(btn_paste_pattern, False, False, 0)

        #BPM/Position
        lbl_bpm = gtk.Label("Bpm:")
        lbl_bpm.show()
        hbox_toolbox.pack_start(lbl_bpm, False, False, 0)
        self.adj_bpm = gtk.Adjustment(value=self.song.get_bpm(), lower=45, upper=240, step_incr=1)
        self.adj_bpm.connect("value_changed", self.adj_bpm_changed)
        spn_bpm = gtk.SpinButton(self.adj_bpm, 0, 0)
        spn_bpm.show()        
        hbox_toolbox.pack_start(spn_bpm, False, False, 4)

        lbl_pos = gtk.Label("Pos:")
        lbl_pos.show()
        hbox_toolbox.pack_start(lbl_pos, False, False, 0)
        self.adj_pos = gtk.Adjustment(value=self.player.get_pos(), lower=0, upper=999, step_incr=1)
        self.adj_pos.connect("value_changed", self.adj_pos_changed)
        spn_pos = gtk.SpinButton(self.adj_pos, 0, 0)
        spn_pos.show()        
        hbox_toolbox.pack_start(spn_pos, False, False, 4)

        btn_play_song = gtk.Button('Play Song')
        btn_play_song.connect("clicked", self.btn_play_song_clicked)
        btn_play_song.show()
        
        hbox_toolbox.pack_start(btn_play_song, False, False, 0)

        hbox_toolbox.show()
        
        vbox.pack_start(hbox_toolbox, False, False, 2)

        # Song items (patterns and channels)
        hpaned_song = gtk.HPaned()

        # Patterns
        frame = gtk.Frame('Patterns')
        frame.set_size_request(700,400)
        #Scroll, to see complete Pattern List
        sw = gtk.ScrolledWindow()

        self.vbox_patterns = gtk.VBox(False, 0)
        self.vbox_patterns.show()

        sw.add_with_viewport(self.vbox_patterns)
        
        sw.show()
        
        frame.add(sw)
        frame.show()
        hpaned_song.add1(frame)
        
        # Channels
        frame = gtk.Frame('Song')
        vbox_channels = gtk.VBox(False,0)

        #Scroll, to see complete Song
        sw = gtk.ScrolledWindow()

        self.hbox_channels = gtk.HBox(False, 0)
        self.hbox_channels.show()
        
        sw.add_with_viewport(self.hbox_channels)
        
        sw.show()
        vbox_channels.pack_start(sw, True, True, 0)
        
        vbox_channels.show()

        frame.add(vbox_channels)
        frame.show()
        
        hpaned_song.add2(frame)

        hpaned_song.show()
        vbox.pack_start(hpaned_song, True, True, 0)


        channels = self.song.get_channels()
        if len(channels): 
            channel = channels[0]
        else:
            channel = self.song.add_channel()
        
        ChannelWidget(self, channel)

        channels = self.song.get_channels()

        if len(channels) == 0:
            return
            
        channel = channels[0]

        #self.player.set_pos(int(self.adj_pos.get_value()))
        self.player.set_data(channel)
        self.player.set_bpm(self.song.get_bpm())
        #self.playing_pos = gobject.timeout_add(500, self.update_playing_pos)

        vbox.show()
        self.add(vbox)
        self.save_state = True
        
    def menu_open(self, widget, data=None):
        if self.save_state:
            response = gtk.RESPONSE_YES
        else:
            dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL , gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
                    "Open another song?\nUnsaved changes will be lost.")

            response = dialog.run()
            dialog.destroy()

        if response == gtk.RESPONSE_YES:
            filename = self.file_dialog('open')
            if filename:
                #Clean previous data
                self.vbox_patterns.foreach(self.vbox_patterns.remove)
                    
                dseq = DSeq1()
                self.song = dseq.open(filename)
                self.adj_bpm.set_value(self.song.get_bpm())

                for pattern in self.song.get_patterns():
                    PatternWidget(self, pattern)
                    for track in pattern.get_tracks():
                        self.conn.create_port(track.synth)

                if len(self.song.get_channels()) == 0:
                    self.song.add_channel()
                self.refresh_channels()

                channels = self.song.get_channels()

                if len(channels) > 0:
                    channel = channels[0]
                    self.player.set_data(channel)
                    self.player.set_bpm(self.song.get_bpm())
                        
                self.filename = filename
                self.save_state = True
        
    def menu_save(self, widget, data=None):
        if self.filename:
            dseq = DSeq1()
            dseq.save(self.filename, self.song)
            self.save_state = True
        else:
            filename = self.file_dialog('save')
            if filename:
                if filename[-5:] != '.dseq':
                    filename = filename + '.dseq'
                self.filename = filename
                dseq = DSeq1()
                dseq.save(self.filename, self.song)
                self.save_state = True
        
    def menu_save_as(self, widget, data=None):
        filename = self.file_dialog('saveas')
        if filename:
            if filename[-5:] != '.dseq':
                filename = filename + '.dseq'
            self.filename = filename
            dseq = DSeq1()
            dseq.save(self.filename, self.song)
            self.save_state = True
            
    def menu_import_patterns(self, widget, data=None):
        filename = self.file_dialog('import')
        if filename:                
            dseq = DSeq1()
            imported_song = dseq.open(filename)
            
            for pattern in imported_song.get_patterns():
                self.song.add_pattern(pattern)
                PatternWidget(self, pattern)
                
            self.filename = filename
            self.refresh_channels()
            self.save_state = False

            
    def menu_import_seq24(self, widget, data=None):
        


        filename = self.file_dialog('import_seq24')
        if filename:                
            imported_song = Song()
            event_handler = midifile.NoteOnPrinter()
            event_handler.set_song(imported_song)
            midi_in = midifile.MidiInFile(event_handler, filename)
            midi_in.read()

            for pattern in imported_song.get_patterns():
                self.song.add_pattern(pattern)
                PatternWidget(self, pattern)
                
            self.filename = filename
            self.refresh_channels()
            self.save_state = False
        
    def file_dialog(self, data=None):
        if data == "open":
            title = 'Open...'
            action = gtk.FILE_CHOOSER_ACTION_OPEN
        elif data == "save":
            title = 'Save...'
            action = gtk.FILE_CHOOSER_ACTION_SAVE
        elif data == 'saveas':
            title = 'Save As...'
            action = gtk.FILE_CHOOSER_ACTION_SAVE
        elif data == "import":
            title = 'Import Patterns From...'
            action = gtk.FILE_CHOOSER_ACTION_OPEN
        elif data == "import_seq24":
            title = 'Import Patterns From Seq24'
            action = gtk.FILE_CHOOSER_ACTION_OPEN
        
        if action == gtk.FILE_CHOOSER_ACTION_OPEN:
            dialog = gtk.FileChooserDialog(title, None, action,
                            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        else:
            dialog = gtk.FileChooserDialog(title, None, action,
                            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
            
        dialog.set_default_response(gtk.RESPONSE_OK)
        
        if 'last_dir' in self.conf.value:
            dialog.set_current_folder(self.conf.value['last_dir'])

        filter = gtk.FileFilter()
        if data != "import_seq24":
            filter.set_name("Desfonema Sequence")
            filter.add_pattern("*.dseq")
        else:
            filter.set_name("Seq24 Sequence")
            filter.add_pattern("*.s24")
            filter.add_pattern("*.seq24")
            filter.add_pattern("*.mid")
        
        dialog.add_filter(filter)

        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        dialog.add_filter(filter)

        response = dialog.run()
        
        filename = ''
        if response == gtk.RESPONSE_OK:
            filename = dialog.get_filename()
            self.conf.value['last_dir'] = dialog.get_current_folder()
            
        dialog.destroy()
        
        return filename
        
    def quit_program(self, widget, data=None):
        if self.save_state:
            response = gtk.RESPONSE_YES
        else:
            dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL , gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
                    "Do you really wanna quit?\nUnsaved changes will be lost.")
                    
            response = dialog.run()
            dialog.destroy()
        
        if response == gtk.RESPONSE_YES:
            self.player.quit()
            self.player_pattern.quit()
            self.conf.save()
            gtk.main_quit()
            return False
        else:
            return True

    def new_file(self, widget, data=None):
        if self.save_state:
            response = gtk.RESPONSE_YES
        else:
            dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL , gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
                    "Create new song?\nUnsaved changes will be lost.")
                    
            response = dialog.run()
            dialog.destroy()
        
        if response == gtk.RESPONSE_YES:
            self.vbox_patterns.foreach(self.vbox_patterns.remove)
            self.song = Song()
            self.song.add_channel()
            self.refresh_channels()
            self.filename = ''
            self.save_state = True
            

    def add_pattern(self, widget, data=None):
        if data == None:
            pattern = self.song.add_pattern()
            pattern.set_len(8)
            pattern.add_track()
            pw = PatternWindow(self, pattern)
            pw.show()
            pw.maximize()
        else:
            pattern = data
            
        PatternWidget(self, pattern)
        self.refresh_channels()
        self.save_state = False

    def add_channel(self, widget, data=None):
        if data == None:
            channel = self.song.add_channel()
        else:
            channel = data
            
        ChannelWidget(self, channel)
        self.save_state = False
        
    def adj_bpm_changed(self, widget, data= None):
        self.song.set_bpm(widget.get_value())
        self.player.set_bpm(self.song.get_bpm())
        self.save_state = False

    def adj_pos_changed(self, widget, data= None):
        self.player.set_pos(int(self.adj_pos.get_value()))

    def btn_play_song_clicked(self, widget, data=None):
        
        if self.player.playing():
            self.player.stop()
            if self.playing_pos:
                gobject.source_remove(self.playing_pos)            
        else:
            channels = self.song.get_channels()

            if len(channels) == 0:
                return
                
            channel = channels[0]

            #self.player.set_pos(int(self.adj_pos.get_value()))
            self.player.set_data(channel)
            self.player.set_bpm(self.song.get_bpm())
            self.playing_pos = gobject.timeout_add(500, self.update_playing_pos)
        
    def update_playing_pos(self):
        pos = self.player.get_pos()
        self.adj_pos.set_value(int(pos))
        return True
        
    def paste_pattern(self, widget, data=None):
        clipboard = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
        clipboard.request_text(self.paste_pattern_clipboard_text_received)
        
    # signal handler called when the clipboard returns text data
    def paste_pattern_clipboard_text_received(self, clipboard, text, data):
        if not text or text == '':
            return
            
        lines = text.split("\n")
        if not len(lines):
            return
            
        if lines[0] != 'Pattern':
            return

        pattern = Pattern()
        self.song.add_pattern(pattern)

        level = 0
        for line in lines:
            if line == "Pattern":
                level = 1

            if line == "Track":
                track = pattern.add_track()
                level = 2
            
            if line == "Notes":
                level = 3

            if level == 1:
                #On Pattern Data
                if line[:5] == "Num: ":
                    pattern.set_num(int(line[5:]))
                elif line[:5] == "Len: ":
                    pattern.set_len(int(line[5:]))
                elif line[:6] == "Name: ":
                    pattern.set_name(line[6:])
            elif level == 2:
                if line[:5] == "Len: ":
                    track.set_len(int(line[5:]))
                elif line[:6] == "Name: ":
                    track.set_name(line[6:])
                elif line[:8] == "Volume: ":
                    track.set_volume(int(line[8:]))
                elif line[:7] == "Synth: ":
                    track.set_synth(line[7:])
                elif line[:6] == "Port: ":
                    track.set_port(int(line[6:]))
            elif level == 3:
                if line == "Notes":
                    pass
                elif line == "EndNotes":
                    level = 2
                else:
                    (note, pos, duration, volume) = line.split(', ')
                    track.add_note(int(note),int(pos),int(duration), int(volume))

        pattern.set_name("Copy of " + pattern.get_name())
        PatternWidget(self, pattern)
        self.refresh_channels()
        self.save_state = False
        return
        
    def refresh_channels(self):
        self.hbox_channels.foreach(self.hbox_channels.remove)
        for channel in self.song.get_channels():
            ChannelWidget(self, channel)        
Exemplo n.º 12
0
                music_wavs[key] = file

        if found:
            print('Found', file_name)

    print('Parsing character and song data')

    characters = {}

    for index, character_data in enumerate(
            song_pack_data['offline_song_pack_list']):
        character = Character(character_data)
        character.number = index + 1

        for song_data in character_data['song_info_list']:
            song = Song(song_data, character.id)
            if config['rename_aesir'] and song.artist == 'Æsir':
                song.artist = config['rename_aesir_to']
            character.songs.append(song)

        characters[character.id] = character

    for expansion_pack in expansion_pack_data['ExpansionPackList']:
        pack_info = ExpansionPackInfo(expansion_pack)
        for song_data in expansion_pack['SongInfoList']:
            song = Song(song_data)
            if config['rename_aesir'] and song.artist == 'Æsir':
                song.artist = config['rename_aesir_to']
            song.expansion_pack_info = pack_info
            characters[song.character_id].songs.append(song)
Exemplo n.º 13
0
	def open(self, filename):
		# Patterns Object
		song = Song()

		f = open(filename)
		line = f.readline()
		#f.write("Desfonema Sequencer File Format Version 1.1\n")
		version = line[40:-1]
		
		#Old version 1 format used 8 ticks for each beat instead of 24
		#so we need to compensate if it's an old format file.
		if version == '1':
			shifter = 3
		else:
			shifter = 1
		#Level Pattern(0) Track(1) or Notes(2)
		level = 0
		while line:
			line = line[:-1]
			if line == "Pattern":
				pattern = Pattern()
				song.add_pattern(pattern)
				level = 1

			if line == "Track":
				track = pattern.add_track()
				level = 2
			
			if line == "Notes":
				level = 3
				
			if line == "Controls":
				level = 5
				
			if line == "Pitchbends":
				level = 6

			if line == "Channel":
				channel = Channel()
				song.add_channel(channel)
				level = 4

			if level == 0:
				if line[:5] == "Bpm: ":
					song.set_bpm(int(line[5:]))
			if level == 1:
				#On Pattern Data
				if line[:5] == "Num: ":
					pattern.set_num(int(line[5:]))
				elif line[:5] == "Len: ":
					pattern.set_len(int(line[5:]))
				elif line[:6] == "Name: ":
					pattern.set_name(line[6:])
			elif level == 2:
				if line[:5] == "Len: ":
					track.set_len(int(line[5:]))
				elif line[:6] == "Name: ":
					track.set_name(line[6:])
				elif line[:8] == "Volume: ":
					track.set_volume(int(line[8:]))
				elif line[:7] == "Synth: ":
					track.set_synth(line[7:])
				elif line[:6] == "Port: ":
					track.set_port(int(line[6:]))
			elif level == 3:
				if line == "Notes":
					pass
				elif line == "EndNotes":
					level = 2
				else:
					line_data = line.split(', ')
					(note, pos, duration) = (line_data[0], line_data[1], line_data[2])
					if len(line_data) == 4:
						volume = int(line_data[3])
					else:
						volume = 127
					track.add_note(int(note),int(pos)*shifter,int(duration)*shifter, volume)
			elif level == 5:
				if line == "Controls":
					pass
				elif line == "EndControls":
					level = 2
				else:
					line_data = line.split(', ')
					(pos, param, value) = (line_data[0], line_data[1], line_data[2])
					track.set_control(int(pos), int(param), int(value))
					
			elif level == 5:
				if line == "Pitchbends":
					pass
				elif line == "EndPitchbends":
					level = 2
				else:
					line_data = line.split(', ')
					(pos, value) = (line_data[0], line_data[1])
					track.set_control(int(pos), int(value))
			elif level == 4:
				if line[:5] == "Pat: ":
					channel.add_pattern(song.get_pattern_by_name(line[5:]))
			
			line = f.readline()

		f.close()
		
		return song