BelajarPython - Assalamualaikum wr. wb.
Jumpa lagi temen - temen... Pada kesempatan kali ini, akan saya gunakan untuk mengajak kalian membuat aplikasi pemutar musik nih... Oke, Biar tidak penasaran langsung saja yuk kita simak sama - sama pengenalan aplikasi nya di bawah ini...
Dan pada versi yang ke enam ini saya akan menambahkan fitur next dan fitur untuk mengembalikan file daftar putar seteleh semua pemutaran selesai..
Aplikasi ini saya posting dengan berbagai versi.. Dengan penambahan fitur di tiap versinya.. Jika kalian ingin melihat versi - versi aplikasi ini, KALIAN BISA KLIK DISINI ya temen - temen...
Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...
Nah lalu, seperti apakah tampilan yang akan di hasilkan dari code program di atas? Langsung saja yuk kita simak sama - sama tampilannya di bawah ini...
Nah itu dia temen - temen penjelasan code programnya.. Mohon maaf ya apabila ada penjelasan yang kurang jelas, atau bahkan ada kekeliruan... Mohon kasi pembenaran atau pendapat kalian di kolom komentar ya temen - temen... Biar kita bisa belajar bersama - sama..
Oke terimakasih dan sampai di sini dulu ya temen - temen... Jangan lupa untuk membaca versi - versi yang lainnya... Biar ilmunya juga nambah.. Hehe.. Temikasih sekali lagi dan sekian...
Wassalamualaikum wr. wb.
Jumpa lagi temen - temen... Pada kesempatan kali ini, akan saya gunakan untuk mengajak kalian membuat aplikasi pemutar musik nih... Oke, Biar tidak penasaran langsung saja yuk kita simak sama - sama pengenalan aplikasi nya di bawah ini...
Pengenalan aplikasi yang akan kita buat.
Jadi, seperti yang sudah saya katakan di pembuka tadi, pada postingan kali ini saya akan membagikan atau mengajak kalian untuk membuat aplikasi pemutar musik...Dan pada versi yang ke enam ini saya akan menambahkan fitur next dan fitur untuk mengembalikan file daftar putar seteleh semua pemutaran selesai..
Aplikasi ini saya posting dengan berbagai versi.. Dengan penambahan fitur di tiap versinya.. Jika kalian ingin melihat versi - versi aplikasi ini, KALIAN BISA KLIK DISINI ya temen - temen...
Rincian Lengkap Aplikasi Pemutar Musik menggunakan PyGame Versi 6.0
Aplikasi kali ini menggunakan library Pygame. Untuk menjalankannya, harus menginstallnya dulu... KLIK DISINI untuk Install Pygame.... Oke, langsung saja yuk kita simak sama - sama rincian lengkap nya di bawah ini...Nama | : mn-mp3player 6.0 |
Versi | : 6.0 | klik disini untuk membaca versi selanjutnya. |
Platform | : Python 3.x |
Modul | : Tkinter dan Pygame. Klik disini untuk menginstallnya. |
Baris Code | : kurang lebih 180 baris code program. |
Terdiri dari | : 1 class dan 19 metode. |
Fitur | : Tombol Next (lagu selanjutnya). |
Kelemahan | : tidak ada previous (karena pemutaran dengan sistem antrian).. |
syarat menjalankan | : install python 3.x dan PyGame, punya editor teks atau IDE. |
Cara menjalankan | : install python 3 dan PyGame, copy dan paste code program pada editor atau IDE, simpan dalam file python(ekstensi .py), lalu jalankan. |
Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...
Code program aplikasi Pemutar Musik menggunakan PyGame versi 6.0
Pada segment kali ini, saya akan memberikan code program untu membuat aplikasinya.. Langsung saja yuk kita simak sama - sama code program nya di bawah ini...import pygame from tkinter import * from tkinter import Tk,filedialog import os class PemutarMusik(Frame): def __init__(self,parent): Frame.__init__(self, parent) self.penampungFile=[] self.penampungNama=[] self.a = StringVar() self.a.set("Play") parent.geometry("470x250") self.parent = parent self.nama = StringVar() self.nama.set("Silahkan Buka file") self.tampungLokasi="" self.berakhir=True self.diStop=False self.bukaLage=True self.fileSudahDiputar=[] self.namaSudahDiputar=[] self.putarLagi=True self.KolomTeks() self.buatTeks() self.buatTombolPlay() self.buatTombolStop() self.tombolNext() self.buatOpen() self.slider() def insialisasiFile(self,file,path): self.penampungFile.append(path) self.penampungNama.append(file) self.refreshKolom() def refreshKolom(self): isi = "" no = 1 for i in self.penampungNama: isi += str(no)+". "+ i + "\n" no +=1 self.setKolom(isi) def getFile(self): file='' if len(self.penampungNama)>0 : file = self.penampungFile.pop(0) nama = self.penampungNama.pop(0) self.fileSudahDiputar.append(file) self.namaSudahDiputar.append(nama) self.nama.set("Now playing : "+nama) self.refreshKolom() return file def putarMusik(self): self.berakhir=True pygame.init() pygame.mixer.init() if self.diStop: self.diStop = False pygame.mixer.music.unpause() self.a.set("Pause") else : self.b = pygame.mixer.music.get_busy() a = len(self.penampungFile) if self.b : if self.a.get()=="Play" : self.a.set("Pause") pygame.mixer.music.unpause() elif self.a.get()=="Pause" : self.a.set("Play") pygame.mixer.music.pause() self.pauseAtauStop=True elif a!=0 : ambilFile = self.getFile() pygame.mixer.music.load(ambilFile) pygame.mixer.music.play() self.putarLagi=True self.refreshKolom() self.getPosisi() self.a.set("Pause") def stopMusik(self): self.b = pygame.mixer.music.get_busy() self.diStop = True if self.b : pygame.mixer.music.play(1,-1) pygame.mixer.music.pause() self.a.set("Play") self.berakhir=False def tombolNext(self): next = Button(text="Next", command=self.next) next.pack(side=LEFT) def next(self): self.b = pygame.mixer.music.get_busy() if self.b : pygame.mixer.music.stop() self.putarMusik() def buatTeks(self): teks = Label(textvariable=self.nama, fg="blue", font="Verdana 10 bold") teks.pack() def buatTombolStop(self): tombol = Button(text="Stop", command=self.stopMusik) tombol.pack(side=LEFT) def buatOpen(self): tombol = Button(text="Open", command=self.bukaFile) tombol.pack(side=LEFT) def buatTombolPlay(self): tombol = Button(textvariable=self.a, command=self.putarMusik) tombol.pack(side=LEFT) def bukaFile(self): tipeFile = [('Mp3 file', '*.mp3'), ('All files', '*')] bukaFile = filedialog.askopenfilenames(filetypes=tipeFile) if bukaFile!="": for i in bukaFile : lokasi = i nama = os.path.basename(lokasi) self.insialisasiFile(nama,lokasi) def volume(self, nilai): v = float(nilai) pygame.init() pygame.mixer.init() pygame.mixer.music.set_volume(v) def slider(self): w1 = Scale(from_=0.00, to=1.0,resolution=0.01, command=self.volume, orient=HORIZONTAL, length=300, label='Volume :',showvalue=0) w1.pack() w1.set(0.50) def KolomTeks(self): self.T = Text(height=12, width=30) self.scrollBar() self.T.configure(state=DISABLED) def setKolom(self, nilai): self.T.config(state=NORMAL) self.T.delete('1.0',END) self.T.insert(END,nilai) self.T.configure(state=DISABLED) def scrollBar(self): S = Scrollbar() S.pack(side=RIGHT, fill=Y) self.T.pack(fill=X) S.config(command=self.T.yview) self.T.config(yscrollcommand=S.set) def getPosisi(self): pygame.init() pygame.mixer.init() posisi=pygame.mixer.music.get_pos() if posisi==-1 and self.berakhir and self.putarLagi: self.putarMusik() self.b = pygame.mixer.music.get_busy() if len(self.penampungFile) == 0 and self.b == False and self.diStop == False : self.nama.set("Pemutaran selesai") self.a.set("Play") for i in self.fileSudahDiputar : self.penampungFile.append(i) for i in self.namaSudahDiputar: self.penampungNama.append(i) self.namaSudahDiputar=[] self.fileSudahDiputar=[] self.refreshKolom() self.putarLagi=False elif (len(self.penampungFile)>0 or self.b) and self.putarLagi : self.timer = self.parent.after(1000, self.getPosisi) root = Tk() PemutarMusik(root) mainloop() pygame.quit()
Nah lalu, seperti apakah tampilan yang akan di hasilkan dari code program di atas? Langsung saja yuk kita simak sama - sama tampilannya di bawah ini...
Penjelasan code program untuk membuat Aplikasi Pemutar musik menggunakan PyGame versi 6.0
Sekarang saya akan mencoba untuk menjelaskan code program yang sudah saya bagikan di atas tadi.. Oke, Langsung saja yuk kita simak sama penjelasannya di bawah ini....
[NOTE : Teks berwarna MERAH pada penjelasan adalah Code tambahan yang tidak ada di versi sebelumnya. Dan yang Berwarna BIRU akan di hapus di versi berikutnya. Jika Code berwarna MERAH dan komentar berwarna BIRU maka merupakan code baru dan akan di hapus di versi berikutnya]
import pygame //mengimport pygame
from tkinter import * //mengimport semua modul tkinter
from tkinter import Tk,END, filedialog //mengimport Tk, END, filedialog tkinter
import os //mengimport os untuk path file mp3
class PemutarMusik(Frame): //membuat class ‘PemutarMusi’ menurunkan class ‘Frame’ dari tkinter
def __init__(self,parent): //Konstruktor class ‘PemutarMusik’
Frame.__init__(self, parent) //memanggil Konstruktor class ‘Frame’. Dan memasukkan class ini (self) dan nilai variabel ‘parent’ sebagai parameter
self.penampungFile=[] //variabel array “penampungFile” untuk menampung path/lokasi file musik
self.penampungNama=[] //variabel array “penampungNama” untuk menampung nama musik
self.a = StringVar() //memanggil dan menampung class ‘StringVar’ dari tkinter. Untuk menampilkan teks ‘pause’ atau ‘play’ di tombol.
self.a.set("Play") //mengubah nilai variabel ‘a’ menjadi ‘Play’
parent.geometry("470x60") //mengatur ukuran window
self.parent = parent //menampung nilai variabel parameter ‘parent’
self.nama = StringVar() //memanggil dan menampung class ‘StringVar’ dari tkinter. Untuk menapilkan nama musik di window..
self.nama.set("Silahkan Buka file") //mengubah nilai variabel ‘nama’
self.tampungLokasi="" //digunakan untuk menyimpan lokasi file
self.berakhir=True //variabel untuk menentukan pemutaran akan berakhir
self.diStop=False //gidunakan untuk sebagai penentu jika pemutaran di stop
self.bukaLage=True //sebagai penentu apakah user membuka file lagi.
self.fileSudahDiputar=[] //variabel array untuk menampung lokasi file yang sudah diputar
self.namaSudahDiputar=[] //variabel array untuk menampung nama file yang sudah diputar
self.putarLagi=True //membuat variabel ‘putarLagi’ untuk menentukan pemutaran seluruh file sudah selesai. (selesai = false)
self.KolomTeks() //memanggil metode ‘KolomTeks’
self.buatTeks() //memanggil metode ‘buatTeks’
self.buatTombolPlay() //memanggil metode ‘buatTombolPlay’
self.buatTombolStop() //memanggil metode ‘buatTombolStop’
self.tombolNext() //memanggil metode ‘tombolNext’
self.buatOpen() //memanggil metode ‘buatOpen’
self.slider() //memanggil metode ‘slider’
def insialisasiFile(self, file, path): //membuat metode ‘inisialisasiFile’ dengan parameter ‘file’ sebagai penampung lokasi file
self.penampungFile.append(path) //memasukkan path file
self.penampungNama.append(file) //memasukkan nama file
self.refreshKolom() //memanggil metode ‘refreshKolom’
def refreshKolom(self): //membuat metode ‘refreshKolom’ untuk memperbarui tampilan nama lagu
isi = "" //membuat variabel ‘isi’ untuk menyusun nama file
for i in self.penampungNama: //melakukan perulangan sebanyak nilai di variabel array ‘penampungNama’
isi += i + "\n" //mengambil dan menampung nilai (nama) di variabel array ‘penampungNama’
self.setKolom(isi) //memanggil metode ‘setKolom’ dengan memasukkan isi variabel ‘isi’ sebagai parameter
def getFile(self): //membuat metode ‘getFile’ untuk mendapatkan file untuk di putar
file='' //membuat variabel ‘file’
if len(self.penampungNama)>0 : //memastikan jumlah item di variabel array ‘penampungNama’ lebih dari 0
file = self.penampungFile.pop(0) //mengambil item urutan terakhir di varaibel array ‘penampungFile’ dan disimpan di ‘file’.
nama = self.penampungNama.pop(0) //mengambil item urutan terakhir di varaibel array ‘penampungNama’ dan disimpan di ‘nama’.
self.fileSudahDiputar.append(file) //memasukkan lokasi file yang akan di putar
self.namaSudahDiputar.append(nama) //memasukkan nama ‘file yang akan di putar
self.nama.set("Now playing : "+nama) //mengubah teks yang di tampilkan di window menjadi nama file yang sedang di puter
self.refreshKolom() //memanggil metode ‘refreshKolom’
return file //mengembalikan lokasi file yang telah di tampung sebelumnya di ‘file’
def putarMusik(self): //membuat metode ‘putarMusik’.
self.berakhir=True //mengubah nilai ‘berakhir’ menjadi ‘true’
pygame.init() //memanggil metode ini di class di pygame’
pygame.mixer.init() //memanggil variabel ‘init’ di class mixer
if self.diStop: //mengecek nilai stop apakah true
self.diStop = False //mengubah nilai ‘diStop’ menjadi ‘False’
pygame.mixer.music.unpause() //melanjutkan musik yang sedang di pause
self.a.set("Pause") //mengubah teks tombol play jadi ‘Pause’
else : //kondisi jika ‘diStop’ bernilai ‘False’
self.b = pygame.mixer.music.get_busy() //mengecek apakah musik sedang diputar. Diputar =True. Berhenti = False.
a = len(self.penampungFile) //menghitung jumlah item ‘penampungFile’ dan di tampung di ‘a’
if self.b: //mengecek nilai b apakah True
if self.a.get()=="Play" : //mengecek apakah nila ‘a’ adalah ‘Play’
self.a.set("Pause") //mengubah nilai ‘a’ menjadi ‘Pause’
pygame.mixer.music.unpause() //melajutkan pemutaran musik
elif self.a.get()=="Pause" : //mengecek apakah nila ‘a’ adalah ‘Pause’
self.a.set("Play") //mengubah nilai ‘a’ menjadi ‘Play’
pygame.mixer.music.pause() //menjeda pemutaran musik
self.pauseAtauStop=True //mengubah nilai menjadi true
elif a!=0 : //mengcek apakah a tidak bernila 0
ambilFile = self.getFile() //memanggil metode ‘getFile’ dan di tampung nilai kembalian nya di ‘ambilFile’
pygame.mixer.music.load(ambilFile) //memuat filemusik yang ada di ‘ambilFile’
pygame.mixer.music.play() //memutar musik
self.file = "" //mengosongkan lokasi file dari variabel
self.refreshKolom() //memanggil metode ‘refreshKolom’
self.getPosisi() //memanggil metode ‘getPosisi’
self.a.set("Pause") //mengubah tombol menjadi ‘Pause’
def stopMusik(self) //membuat metode ‘stopMusik’
self.b = pygame.mixer.music.get_busy() //mengecek apakah musik sedang di putar. Sedang diputar = True. Tidak sedang diputar = false.
self.diStop = True //menguba nilai ‘diStop’ jadi True
if self.b : //mengcek nilai ‘b’ apakah bernilai true
pygame.mixer.music.play(1,-1) //memutar musik
pygame.mixer.music.pause() //men jeda musik
self.a.set("Play") //mengatur teks tombol agar menjadi ‘Play’
self.berakhir=False //mengubah nilai ‘berakhir’ menjadi false
def tombolNext(self): //membuat metode
next = Button(text="Next", command=self.next) //membuat tombol dengan perintah menjalankan metode ‘next’
next.pack(side=LEFT) //memasukkan tombol
def next(self): //membuat metode
self.b = pygame.mixer.music.get_busy() //mengecek apakah musik sedang di putar (true=sedang diputar) dan disimpan ke ‘b’
if self.b : //memastikan ‘b’ bernilai true
pygame.mixer.music.stop() //menghentikan musik
self.putarMusik() //memanggil metode ‘putarMusik’
def buatTeks(self): //membuat metode ‘buatTeks’
teks = Label(textvariable=self.nama, fg="blue", font="Verdana 10 bold")
teks.grid(row=0, column=0, columnspan=3)
def buatTombolStop(self): //membuat metode ‘buatTombolStop’
Button(text="Stop", command=self.stopMusik) //membuat tombol ‘stop’ dengan perintah menjalankan metode ‘stopMusik’
tombol.pack(side=LEFT) //memasukkan tombol ke window
def buatOpen(self): //membuat metode ‘buatOpen’
Button(text="Open", command=self.bukaFile) //membuat tombol ‘Open’ dengan perintah menjalankan metode ‘bukaFile’
tombol.pack(side=LEFT) //memasukkan tombol ke window
def buatTombolPlay(self): //membuat tombol play
Button(text="Play", command=self.putarMusik) //membuat tombol ‘Play’ dengan perintah menjalankan metode ‘putarMusik’
tombol.pack(side=LEFT) //memasukkan tombol ke window
def bukaFile(self): //membuat metode ‘bukaFile’
tipeFile = [('Mp3 file', '*.mp3'), ('All files', '*')] //menentukan file yang bisa di buka
bukaFile = filedialog.askopenfilenames(filetypes=tipeFile) //membuka file dialog untuk memilih file. Dan yang terpilih path nya di tampung di ‘bukaFile’
if bukaFile!="": //memastikan ‘bukaFile’ tidak kosong (memastikan user memilih file’
for i in bukaFile : //melakukan perulangan sebanyak item di array ‘bukaFile’
lokasi = i //mengoper nilai i kedalam ‘lokasi’
nama = os.path.basename(lokasi) //digunakan untuk mengambil namanya saja dari file yang dipilih dan disimpan ke ‘nama’
self.insialisasiFile(nama,lokasi) //memanggil metode ‘inisialisasiFile’ dan memasukkan ‘nama’ dan ‘lokasi’ sebagai parameter
def volume(self, nilai): //membuat metode ‘volume’ dengan parameter ‘nilai’ untuk mengubah volume
v = float(nilai) //mengubah nilai menjadi ‘float’ dan ditampung di ‘v’
pygame.init() //memanggil konstruktor ‘pygame’
pygame.mixer.init() //memanggil konstruketor class ‘mixer’ dalam pygame
pygame.mixer.music.set_volume(v) //mengubah volume menjadi yang ada di ‘v’
def slider(self): //membuat metode ‘slider’
w1 = Scale(from_=0.00, to=1.0,resolution=0.01, command=self.volume, orient=HORIZONTAL, length=300, label='Volume :',showvalue=0) //digunakan untuk membuat slider. Nilainya di kirim ke metode ‘volume’ nilai dari 0.00 - 1.0. Dengan perubahan ketika di gerser sebesar : 0.01.
w1.grid(row=1, column=3) //memasukkan slider ke window
w1.set(0.50) //mengatur volume (slider) agar ada di tengah
def KolomTeks(self): //membuat metode ‘KolomTeks’
self.T = Text(height=12, width=30) //membuat kolom teks. Disimpan di ‘T’
self.scrollBar() //memanggil metode ‘scrollBar’
self.T.configure(state=DISABLED) //agar kolom teks tidak bisa di edit
def setKolom(self, nilai): //membuat metode ‘setKolom’
self.T.config(state=NORMAL) //membuat kolom teks bisa di edit
self.T.delete('1.0',END) //menghapus semua isi kolom teks
self.T.insert(END,nilai) //memasukkan isi ‘nilai’ sebagai isi kolom
self.T.configure(state=DISABLED) //membuat kolom teks agar tidak bisa di edit
def scrollBar(self): //membuat metode ‘scrollBar’
S = Scrollbar() //memanggil metode ‘scrollBar’
S.pack(side=RIGHT, fill=Y) //memasukkan scrollbar ke window
self.T.pack(fill=X) //memasukkan kolom teks (T) ke dalam window
S.config(command=self.T.yview) //mengubungkan scrollbar ke kolom teks (T)
self.T.config(yscrollcommand=S.set) //mengatur perintah scroll kolom teks ke scroll
def getPosisi(self): //membuat metode ‘getPosisi’
pygame.init() //inisialisasi pygame
pygame.mixer.init() //inisialisasi mixer
posisi=pygame.mixer.music.get_pos() //mendapatkan posisi pemutaran
if posisi==-1 and self.berakhir: //mengecek apakah posisi nya = -1 (selesai) dan ‘berakhir’ bernilai true
self.putarMusik() //memanggil metode ‘putarMusik’
self.b = pygame.mixer.music.get_busy() //mengecek apakah musik sedang di putar. True = sedang diputar. False = tidak diputar
if len(self.penampungFile) == 0 and self.b == False and self.diStop == False : //mengecek apakah jumlah musik kosong (0) dan b=0 dan ‘diStop’ bernilai False. Semua harus bernilai True.
self.nama.set("Pemutaran selesai") //mengubah teks di window menjadi ‘Silahkan Buka file’
self.a.set("Play") //mengubah tombol menjadi ‘play’
for i in self.fileSudahDiputar : //melakukan perulangan sebanyak item di ‘fileSudahDiputar’
self.penampungFile.append(i) //memasukkan item di ‘fileSudahDiputar’ ke dalam ‘penampungFIle’.
for i in self.namaSudahDiputar: //melakukan perulangan sebanyak item di ‘namaSudahDiputar’
self.penampungNama.append(i) //memasukkan item di ‘namaSudahDiputar’ ke dalam ‘penampungNama’.
self.namaSudahDiputar=[] //mengosongkan ‘namaSudahDiputar’
self.fileSudahDiputar=[] //mengosongkan ‘namaSudahDiputar’
self.refreshKolom() //memanggil metode ‘refresKolom’
self.putarLagi=False //mengubah menjadi ‘false’
elif (len(self.penampungFile)>0 or self.b) : //memastikan jumlah musik ada atau > 0. Dan ‘b’ bernilai True. (salah satu True, maka true)
self.timer = self.parent.after(1000, self.getPosisi) //memanggil metode ‘getPosisi’ setiap 1 mili detik
root = Tk() //memanggil window tkinter
PemutarMusik(root) //memanggil class. Dan memberi variabel ‘root’ sebagai parameter.
mainloop() //agar window tidak langsung close
pygame.quit() //menutup ‘pygame’
Nah itu dia temen - temen penjelasan code programnya.. Mohon maaf ya apabila ada penjelasan yang kurang jelas, atau bahkan ada kekeliruan... Mohon kasi pembenaran atau pendapat kalian di kolom komentar ya temen - temen... Biar kita bisa belajar bersama - sama..
Oke terimakasih dan sampai di sini dulu ya temen - temen... Jangan lupa untuk membaca versi - versi yang lainnya... Biar ilmunya juga nambah.. Hehe.. Temikasih sekali lagi dan sekian...
Wassalamualaikum wr. wb.
ConversionConversion EmoticonEmoticon