4 lipca 2009

interakcja + dzwięk + visual framework = reactable

W świecie geeków oraz szeroko rozumianym świece akademickim istnieją różne zabawki dla dużych dzieci. Dla jednych włąściwie tylko zabawki, dla innych prace naukowe oraz jedyna pasja. Jedną z nich jest fantastyczne przedsięwzięć są festiwale muzyki elektronicznej z niestandarowymi instrumentami o nazwie Reactable.



W mniemaniu umuzykalnionej i wykształconej osoby grającej na klasycznym instrumencie może istnieć bariera do dźwięków, które nie wywodzą się z czystej klasyki. Na szczęście takiego problemu nie mają ludzie tworzący projekt Reactable. Postanowili oni stworzyć technologie wsprartą dedykowanym frameworkiem do zabawy z dźwiękiem.
Wymyślili do teogo celu następujące rozwiązanie. Wymagany jest do tego celu projektor graficzny + kamera + stół z szybą. Pod stołem umieszczony jest projektor rzutujący od dołu na stół obrazy oraz zwierciadło półprzeźroczyste z odpowiednio ustawioną kamerą, która widzi blat stołu. Umieszczając na blacie krążki z naklejonymi od dołu kształtami dołączamy do brzmień kolejne tony, instrumenty, efekty. Wówczas kamera przekazuje obraz do dedykowanego oprogramowania i steruje projekcją wideo. Stąd niesamowite efekty wizualizacji. Dźwięk wytwarzany jest na podstawie algorytmów, które pozwalają miksować i synchronizować brzmienia jakie posiadają zaprogramowane krążki.



Całość daje niesamowicie gwiezdny efekt :-) Popatrzcie sami:













Materiały dodatkowe:
Reactable - media
ReactiVision framework

2 lipca 2009

newt - konsolwe UI może być lżejsze od ncurses

W trosce o banalne wykorzystania konsoli do celów wybrania kilku parametrów z listy dostępnych, autorzy biblioteki programistycznej newt udowodnili, że wcale nie musimy pisać niesamowicie złożonego kodu. Okazuje się, że biblioteka newt jest tym, czego potrzebuje czasmi każdy programista i ułątwia znacząco życie w pisaniu dedykowanych narzędzi z czytelnym interfejsem tekstowym zawierającym formularze.

Dla przykładu, gdy będziemy posiadali potrzebę napisania kilku formularzy dla konsoli - o skali trudności jak w poniższych przykładach - zachęcam do użycia biblioteki newt w wersji dla języka Python - python-newt.

W prostocie siła - zapraszam do przeglądu możliwości na kilku poniższych fotkach.











Poniżej kod wjęzyku Python umożliwiający utworzenie prezentowaych na obrazkach formularzy:


#!/usr/bin/python

from snack import *
import sys

def help(screen, text):
raise ValueError, "foo"
ButtonChoiceWindow(screen, "Help", text, help = "Help on help")

t = TextboxReflowed(25, "Some text which needs to be wrapped at a good place.")
li = Listbox(5, width = 20, returnExit = 1)
li.append("First", "f")
li.append("Second", "s")
li.insert("Another", "a", "f")
li.delete("a")
ct = CheckboxTree(5, scroll = 1)
ct.append("Colors")
ct.addItem("Red", (0, snackArgs['append']), "red item key")
ct.addItem("Yellow", (0, snackArgs['append']))
ct.addItem("Blue", (0, snackArgs['append']))
ct.append("Flavors")
ct.addItem("Vanilla", (1, snackArgs['append']))
ct.addItem("Chocolate", (1, snackArgs['append']))
ct.addItem("Stawberry", (1, snackArgs['append']))
ct.append("Numbers")
ct.addItem("1", (2, snackArgs['append']))
ct.addItem("2", (2, snackArgs['append']))
ct.addItem("3", (2, snackArgs['append']))
ct.append("Names")
ct.addItem("Matt", (3, snackArgs['append']))
ct.addItem("Shawn", (3, snackArgs['append']))
ct.addItem("Wilson", (3, snackArgs['append']))
ct.append("Months")
ct.addItem("February", (4, snackArgs['append']))
ct.addItem("August", (4, snackArgs['append']))
ct.addItem("September", (4, snackArgs['append']))
ct.append("Events")
ct.addItem("Christmas", (5, snackArgs['append']))
ct.addItem("Labor Day", (5, snackArgs['append']))
ct.addItem("My Vacation", (5, snackArgs['append']))
b = Button("Button")
e = Entry(15, "Entry")
l = Label("label")
cb = Checkbox("checkbox")
r1 = SingleRadioButton("Radio 1", None, 1)
r2 = SingleRadioButton("Radio 2", r1)

def something():
print hello

screen = SnackScreen()

screen.helpCallback(help)

foo = EntryWindow(screen, 'Title', 'This is some text for the entry window',
['prompt', 'more', 'info'])

lbcw = ListboxChoiceWindow(screen, 'Title 2',
'Choose one item from the list below:',
('One', 'Two', 'Three', 'Four', 'Five'), default = 2,
help = "Help for a listbox")

sg = Grid(2, 3)
sg.setField(b, 0, 0, anchorLeft = 1)
sg.setField(e, 1, 0, (1, 0, 0, 0), anchorLeft = 1, anchorTop = 1)
sg.setField(l, 0, 1, (0, 1, 0, 0), anchorLeft = 1)
sg.setField(cb, 1, 1, (1, 1, 0, 0), anchorLeft = 1)
sg.setField(r1, 0, 2, (0, 0, 0, 0), anchorLeft = 1)
sg.setField(r2, 1, 2, (1, 0, 0, 0), anchorLeft = 1)

g = Grid(1, 3)

g.setField(t, 0, 0)
g.setField(li, 0, 1, (0, 1, 0, 1))
g.setField(sg, 0, 2)

g.place(1, 1)

screen.gridWrappedWindow(g, "title")

f = Form("This is some help")
f.add(li)
f.add(b)
f.add(e)
f.add(l)
f.add(cb)
f.add(r1)
f.add(r2)
f.add(t)

res = f.run()

screen.popWindow()

g = GridForm(screen, "Tree", 1, 2)
g.add(ct, 0, 0, (0, 0, 0, 1))
g.add(Button("Ok"), 0, 1)
g.runOnce()


screen.finish()

print "val", e.value()
print "check", cb.value()
print "r1", r1.selected()
print "listbox", li.current()
# returns a tuple of the wrapped text, the actual width, and the actual height
print res

print foo
print 'lbcw', lbcw
print "ct selected", ct.getSelection()
print "ct current", ct.getCurrent()


Ponadto dla wymagających istnieje też port formularzy do konsoli graficznej GTK - gnewt
Dostępny jest też tutorial do newt.