ven, 21/12/2012 - 00:01
#1 [4]
Liens
[1] http://refra.fr/portail/user/login?destination=comment/reply/100%23comment-form
[2] http://refra.fr/portail/user/register?destination=comment/reply/100%23comment-form
[3] http://refra.fr/portail/node/100#comment-1334
[4] http://refra.fr/portail/node/100
[5] http://refra.fr/portail/user/52
[6] http://refra.fr/portail/comment/147#comment-147
[7] http://official.fm/kurtzlapinic
--=============================================================
-- Words Pad pour Frogoïd v.1.0
-- Design:Satobox Code:Uprime22 Trad:kurtz/lapiNIC
-- URL de référence pour l'utilitaire japonais :
-- (http://reg.s63.xrea.com/BBS/viewtopic.php?f=2&t=524&start=0 )
-- URL de référence pour l'utilitaire français :
-- (http://www.refra.fr/portail/node/100)
--================================================================
--[[
========================
main.lua
========================
--]]
-- Le concept de frogoïd est quasi similaire à celui développé pour renoid,
-- la différence réside dans le fait que les phonèmes ont été précisément
-- recrées pour permettre un maximum d'articulations verbales en
-- langue française ; je les appelle : les "morphèmes" (cf : barbarisme).
-- le problème est que la quantité de morphèmes nécessaire
-- est bien plus grande que ce que prévoit le code initial de renoid !
-- En effet, j'en ai créé 254. Il en résulte que frogoïd doit dispatcher
-- ses échantillons de façon très différente ; alors comment ?
-- En utilisant les fonctions avancées de la tabulation Sample Keyzones.
-- L'idée principale est d'empiler tous les samples sur 20 strates de vélocité
-- bien différentes, et de désarrimer la vélocité au volume ;
-- Le "package vocal" est ainsi réparti dans une matrice en 2D où
-- sur l'axe x (notes de C-0 à C-4) on én umère toutes les voyelles possibles
-- sur l'axe y, (vélocité de 08 à 7F), on énumère toutes les consonnes possibles
-- les zones contiennent des samples bouclés (forward) et accordés sur 440Hz.
-- Cette stratégie permet de n'avoir qu'un seul et unique instrument de stockage
-- d'échantillons, malgré le nombre important de morphèmes nécessaires.
-- Pour la fonction move_cursor, l'inspiratio vient de KMaki et Joule
-- un grand merci à eux !
-- http://forum.renoise.com/index.php?/topic/32240-snippet-edit-step/
require ("move_cursor")
-- la fonction suivante transmet à l'éditeur les ordres d'ajout de notes
-- chaque note étant associée à un "morphème" et à une vélocité précise
-- on a aussi les boutons 'up','down'.
-- notez que 'up','down' fonctionnent selon le paramètre edit step
function note_it (note,velo)
local s = renoise.song()
if s.transport.edit_mode == true
then
if note =="down" then move_cursor()
elseif note =="up" then move_cursor(- s.transport.edit_step)
else
s.selected_note_column.note_string = note
-- ça je viens de l'ajouter, je définirai les vélocités plus tard
s.selected_note_column.volume_string = velo
if note =="---" then
s.selected_note_column.instrument_value =255
else
s.selected_note_column.instrument_value =
s.selected_instrument_index -1
end
move_cursor()
end
else return nil
end
end
-- initialisation des tables pour l'interface graphique et les valeurs des boutons
function set_ini(tbl)
local new ={}
for i,val in pairs(tbl) do
if type(val) ~= "table" then
new[i] = nil
else
new[i] = set_ini(val)
end
end
return new
end
--[[ là c'est de la donnée pure?]]------------------------
-- voici les tables contenant les noms des morphèmes
-- leurs correspondances sur les sample keyzones?
-- sous forme de notes et de vélocités
local tbl_ons =
{
{
{"a","e","i","o","u","an","un","on","ou","oi","é","è"},
{"ba","be","bi","bo","bu","ban","beu","bin","bon","bou","boi","bé","bè"},
{"da","de","di","do","du","dan","din","don","dou","doi","dé","dè"},
{"fa","fe","fi","fo","fu","fan","feu","fin","fon","fou","foi","fé","fè"},
{"ga","ge","gi","go","gu","gan","geu","gin","gon","gou","goi","gé","gè"},
{"cha","che","chi","cho","chu","chan","cheu","chin","chon","chou","choi","ché","chè"},
{"ja","je","ji","jo","ju","jan","jin","jon","jou","joi","jé","jè"},
{"ka","ke","ki","ko","ku","kan","keu","kin","kon","kou","koi","ké","kè"},
{"la","le","li","lo","lu","lan","leu","lin","lon","lou","loi","lé","lè"},
{"ma","me","mi","mo","mu","man","meu","min","mon","mou","moi","mé","mè"}
},
{
{"na","ne","ni","no","nu","nan","neu","nin","non","nou","noi","né","nè"},
{"pa","pe","pi","po","pu","pan","peu","pin","pon","pou","poi","pé","pè"},
{"ra","re","ri","ro","ru","ran","reu","rin","ron","rou","roi","ré","rè"},
{"sa","se","si","so","su","san","sin","son","sou","soi","sé","sè"},
{"ta","ti","to","tu","tan","teu","tin","ton","tou","toi","té","tè"},
{"va","ve","vi","vo","vu","van","veu","vin","von","vou","voi","vé","vè"},
{"wa","we","wi","wo","wu","wan","weu","win","won","wou","woi","wé","wè"},
{"xa","xe","xi","xo","xu","xan","xeu","xin","xon","xou","xoi","xé","xè"},
{"ya","ye","yi","yo","yu","yan","yeu","yin","yon","you","yoi","yé","yè"},
{"za","ze","zi","zo","zu","zan","zeu","zin","zon","zou","zoi","zé","zè"},
{"OFF"}
},
{
{"?","?"}
}
}
-- les notes qui correspondent sont dispatchées dans une sorte de matrice 2d?
-- les valeurs 'C-0' - 'G-9', 'OFF' or '---'?
-- ?'up','down'? peuvent être retournées
-- et correspondant à la position sur l'axe des x sur les sample keyzones
local tbl_notes =
{
{
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"}
},
{
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"C-0","E-0","G#0","C-1","E-1","G#1","C-2","E-2","G#2","C-3","E-3","G#3","C-4"},
{"OFF"}
},
{
{"up","down"}
}
}
-- là je rajoute en plus au code initial les valeurs de vélocité et ce
-- dans une nouvelle table tbv_velo, qui précise la hauteur de la vélocité
-- ATTENTION : cette stratégie ne fonctionne que si et seulement si
-- le bouton VEL->VOL est DECOCHE (ça permet de grouper en un seul
-- instrument la totalité des samples!). J'allais quand même pas
-- répartir tout ça sur 3 ou 4 banques étallées sur 3 ou 4 .xrni !
local tbl_velo =
{
{
{"7F","7F","7F","7F","7F","7F","7F","7F","7F","7F","7F","7F"},
{"79","79","79","79","79","79","79","79","79","79","79","79","79"},
{"73","73","73","73","73","73","73","73","73","73","73","73"},
{"6D","6D","6D","6D","6D","6D","6D","6D","6D","6D","6D","6D","6D"},
{"67","67","67","67","67","67","67","67","67","67","67","67","67"},
{"61","61","61","61","61","61","61","61","61","61","61","61","61"},
{"5B","5B","5B","5B","5B","5B","5B","5B","5B","5B","5B","5B"},
{"55","55","55","55","55","55","55","55","55","55","55","55","55"},
{"4F","4F","4F","4F","4F","4F","4F","4F","4F","4F","4F","4F","4F"},
{"49","49","49","49","49","49","49","49","49","49","49","49","49"}
},
{
{"43","43","43","43","43","43","43","43","43","43","43","43","43"},
{"3D","3D","3D","3D","3D","3D","3D","3D","3D","3D","3D","3D","3D"},
{"37","37","37","37","37","37","37","37","37","37","37","37","37"},
{"31","31","31","31","31","31","31","31","31","31","31","31"},
{"2B","2B","2B","2B","2B","2B","2B","2B","2B","2B","2B","2B"},
{"25","25","25","25","25","25","25","25","25","25","25","25","25"},
{"1F","1F","1F","1F","1F","1F","1F","1F","1F","1F","1F","1F","1F"},
{"19","19","19","19","19","19","19","19","19","19","19","19","19"},
{"13","13","13","13","13","13","13","13","13","13","13","13","13"},
{"0D","0D","0D","0D","0D","0D","0D","0D","0D","0D","0D","0D","0D"},
{""}
},
{
{"",""}
}
}
---------------------------------------
-- maintenant, on prépare l'interface graphique en définissant
-- les valeurs limites desbords et des boutons
-- simplement à partir des nombres d'items des tables
function hmax()
return table.maxn(tbl_ons)
end
function gmax(h)
return table.maxn(tbl_ons[h])
end
function dmax(h,g)
return table.maxn(tbl_ons[h][g])
end
-- dessin de la GUI proprement dite
function on_buttons ()
local vb = renoise.ViewBuilder()
-- ViewBuilder comme son nom l'indique va créer une interface?
-- ya 3 volets, (1) le premier bloc de morphèmes sur 10 lignes à gauche
-- (2) le second bloc de morphèmes sur 10 lignes à droite
-- (3) les boutons up&down en dessous
local s0
local s1 = set_ini(tbl_ons)
local s2 = set_ini(tbl_ons)
local s3 = set_ini(tbl_ons)
-- à l'occasion on définit quoi faire quand un bouton est actionné
-- via le notifier
for h = 1,hmax() do
for g = 1,gmax(h) do
for d = 1,dmax(h,g) do
s3[h][g][d] =
vb:button ({
width = 35,
height = 35,
text = tbl_ons[h][g][d],
notifier =
function()
note_it(tbl_notes[h][g][d], tbl_velo[h][g][d])
end
})
end
end
end
for h = 1,hmax() do
for g = 1,gmax(h) do
s2[h][g] =
vb:row(s3[h][g])
end
end
for h = 1,hmax() do
s1[h] =
vb:column(s2[h])
end
-- il faut quelques espaces entre les boutons !
s0 = vb:row{s1[1], spacing =12, vb:column{s1[2],spacing =20,s1[3]}}
-- et il faut aussi un titre à l'application
renoise.app():show_custom_dialog("Words Pad pour Frogoïd" ,s0)
end
-- sans oublier de rajouter une entrée au menu de la piste éditée :
renoise.tool():add_menu_entry {
name = "Pattern Editor:Words Pad pour Frogoïd...",
invoke = function() on_buttons() end
}
lapiNIC [7]