#Estrella was my name in Spanish class
Explore tagged Tumblr posts
Text
Torg art dump! It's a genrebending tabletop RPG of variety pack characters with reality powers trying to save Earth from extradimensional invaders from various genre flavored worlds, each with their own twist. My dad runs a couple games of it- on in the pulp action Nile Empire, another in the primeval Living Land. Our Nile group is a super cleric of Horus-Re who used to be a pyramid toaur guide, a braniac German aerospace engineer with super smarts and a lightning ray gun, a psychotic berserker demon slaying Russian gunman, a Japanese policeman who's a minor wizard, an elven archer/ranger with a wolf and a small dragon, and a psionic electroninja with demontechnoswords. The Living Land group is made up of a hockey mom turned warrior barbarian life priestess, a lizardman beastmaster, a blind teenage French white witch from a place called the Cyberpapacy, a paleontology professor turned Indiana Jones-esque explorer with a whip and fedora and everything, and a lucky truck driver.
This is normal for Torg.
OC rant time! The super braniac and the truck driver are both mine. Heidi Eklund the aerospace engineer, weird cat lady, and eclectic aunt was visiting the Great Pyramids on vacation when the Maelstrom Bridge of the Nile Empire dropped and the Reality Storm engulfed the land in the axioms and laws of another world. She transformed into Captain Quasar!, superhero of mighty brain and wielding a goofy zappy ray gun she called the Ultrazonic Fulmonizer. She has since invented a couple more gadgets; the Electrokinetic Replusion Shield Generator (a force field) and her much less fancy but signature duct tape guantlet. She loves witty combat banter and bonkers over the top pun cascades, and has an almost beat poet style even in battle. Her nemesis is Professor Plasmo, who also wields SCIENCE, but for evil, not good!
Captain Quasar! is my favorite tabletop rpg character I have ever played, which is funny because she started as a pregen character for a two session intro to the game but became Mine. I love her so much that she became something of an online persona. Now that I've actually designed an intentional persona, she's not the main one anymore, but she is 100% an aspirational character (mostly by accident) and remains a major persona for me. There is so much nice art of her by other lovely artists; it can be beheld and gazed upon here. https://toyhou.se/22797747.captain-quasar-heidi-eklund
Bud is just a dude! He's just a guy! He's very American- pretty stereotypically so in fact, except that he's probably a lot nicer and more polite than average. He does not seem like the type of guy to be of much use on an adventure into dinosaur infested jungles, And Yet. He has a knack for...whatever needs to get done, most of the time, and is just vaguely lucky, plucky, and hard to keep down, with an indomitable positivity and relentless spirit. He supports his companions and is a tremedous help to have around, even if he's not usually the one doing dramatic stunts and wild combat maneuvers. He definitely pulls his own weight, lack of pizazz or no, and is decently capable with a gun and in melee, and can handle himself and a variety of tasks. He doesn't lose his head easily, and is overall fairly sensible and insightful. But you wouldn't guess it, because he's not exactly the brains of the operation; school smarts were never his specialty, and he's never claimed to be clever.
#oc rambling#oc rant#torg#ttrpg#nile empire#living land#trucker#superhero#disclaimer Quasar may be a persona of mine and she is German but I am not German#it was an accident#i just got attached to her#my main persona's name is Estrella but I'm not Hispanic either and I don't even speak Spanish#I took classes but forgot how#alas#Estrella was my name in Spanish class#I just like it#it sounds nice#it means star#but actually I'm French and English#except I have never been to France#or England#I'm just American#isn't it funny that my ancestors used to hate each other's guts#but then they started kissing somewhere down the line#and then boom I happened#love (:#second disclaimer#Bud is based on a lot of stereotypes but spun in a nice direction#he is not meant to actually represent truckers or all white american dudes#truckers ain't dumb
0 notes
Text
Don't mind me, just yapping and organizing my thoughts about my olnf mcs! Specifically step 1 for now, will probably do step 2 soon though bc I love writing and talking about them 😊
Nova Grace "Gracie" Woods! She currently identifies as a girl and uses She/Her. (Nova was my second requested voiced name for the ks after my irl name, so hopefully it makes it in!)
A nervous wreck about pretty much everything. Bffs with Tamarack and has a crush on Qiu, though she hasn't realized it yet! She prefers not to talk a lot and communicates mostly through ASL(she and Opal are fluent) or writing.
Very short, probably a good inch or two shorter than Tama. She is half Black on Opal's side and half Native Hawaiian from her donor. Her hair is actually dark blue and not brown like how the doll maker currently makes it look. Qiu probably thought she was exaggerating when she said she falls a lot, and very quickly finds out she was not. She's very rarely without a bandage or two at this age.
Her favorite color is teal, or really any shade of blue. She's autistic and has a special interest in space, and is usually wearing something with a design or pattern around that. She loves playing in the woods, especially with her two best neighbors 😊
Annabeth "Beck" Estrella Hyyde! She was born intersex and AFAB, and currently uses She/Her. (Annabeth was my third requested voiced name, so we'll see if that ends up in there lol)
A very outgoing and hyperactive kid, Beck loves anything to do with the outdoors or making new friends. She has a crush on Tamarack and is good friends with Qiu. It doesn't show on the doll, but she has a white streak in the front of her hair from her vitiligo. (She's the one holding Tama in my profile pic!)
She is Afro-Latina with Dominican roots. She was born in the US but moved to and around South America as a baby and young kid before Opal's job took them back to the states when she was 8. Spanish is her first language and English is her second.
She currently has undiagnosed ADHD and dyslexia and struggles in school even though she always tries her best. I feel like Mrs. Murray would be the type to recognize effort and desire to learn, plus she's still in elementary so her grades wouldn't be bad. In later steps this is not necessarily the case unfortunately.
Although she loves all sports, soccer is the coolest and her most favorite. She can juggle it 40 times in a row without dropping it, just watch! Her favorite color is rainbow, or maybe cranberry like her and her Mamá's hair.
Elijah "Eli" Othello Anderson. He currently identifies as a boy and uses He/Him. He's Black and doesn't know(aka I haven't decided) much about his heritage. I am on the fence about his current hair color and might change or tweak it a bit.
One of the most laid back and breezy kids you'll ever meet. He just wants to have fun and make new friends! He's got a pun or other terrible joke ready at any given moment so watch out.
He does have a bad habit of putting others before himself, much to the disappointment of his Mama. Is it really such a bad thing that he wants to make other people happy?
He finds something of a kindred soul in Qiu in that way. They just get each other in a way most other kids don't. They're clearly destined to be best friends, or maybe even more. He has a soft spot for Tam too, hopefully they'll all be good friends forever.
Cassiopeia "Cassie" Lotus Aoki-Jones. She identifies as a girl and has since she was six and currently uses She/Her. Her mom has Egyptian heritage and her donor was half Japanese.
More than anything, Cassie is mad. She doesn't want to move away from her old friends and life, especially to a place surrounded by dirty and icky woods. Why couldn't she and her annoying Mom just stay where they were?
No one else here even knows about roller skating, or butterflies, or anything cool. Sigh, at least there's a ballet class where she can show off her skills.
Most things here are pretty bad, but the two neighbors her age are pretty okay. Both of them are nice and sweet and pretty... what was she saying again?
#our life now and forever#ol2#olnf#olnf mc#mc nova#mc annabeth#mc beck#mc eli#mc cassie#i love them your honor#step 1
12 notes
·
View notes
Note
I almost screamed when i saw you update. The pleasure to read one of my favourite woso series after I just gave my physics exam...
After reading the fic i might just melt from cuteness.. thank you for the update so much. May i request a soft headcanon of our little ⭐ with ingrid and Irene.... How is our star studies going on ?
Congrats about your exam, I hope you get a good mark in return anon x
Headcanons below the cut!
Irene
Walks her to the La Masia facilities after training so she can go to class. Nenita hates it because everyone loves Irene more than her and thinks she’s so cool because she’s in the first team, and Nenita’s just like, “I’m in the team too!”
Co-parents Nenita with Frido and Alexia. She’s like a second mum to her, and whenever Barcelona are on the attack Irene tells Nenita about all the attackers on the other team and what to watch out for in them, if Irene has experience with them
She’s another one of Nenita’s personal bodyguards at the Spain camp and for the first 3 days she lets almost nobody near her except Jenni, Laia, Misa, Leila and of course the Barça girls
Could not shut up about Nenita’s goal for a solid month after it happened. Alexia is insufferable about it, but Irene was another level. She was so proud of her
She tells Nenita all the time that she’s grateful she chose to play for Spain, because she has first-hand experience playing against the French and she knows the Spanish girls would hate playing against you and them
Ingrid
She calls her Herlig, which means lovely. She thinks it’s a very fitting name and Estrella appreciates that it’s easier to pronounce than Kärlek
They have a tradition of making caramel-drizzled marshmallow popcorn bites which they eat while watching a movie. Ingrid leaves Herlig in charge of making the popcorn and warming up the caramel while she melts down the marshmallows, sometimes she even melts down some chocolate
She sometimes has to help her tie her shoelaces when she gets frustrated with them and her laces just won’t cooperate. Herlig thanks her through sniffles and she’s very obviously on the brink of tears until Ingrid ties her boots nice and tight
Always includes Herlig in her photo dumps
She’s the one that picks Herlig up from her classes at La Masia, and she often helps her study and revise for any exams she has. Because of this, Herlig has stellar grades and is top of the class
12 notes
·
View notes
Note
🌿🎤🦋!
Hello thank you for the ask 💚💚💚
- Describe you favourite outfit: Ohhhh !! One outfit that I wear way too much because I love the silhouette is wide brim hat, short sleeved shirt or t-shirt (black or green of course), high waited loose black jeans, with either my docs or my creepers!! I've been wearing that all summer lol
- Is there a song that you know all lyrics to: OH BOY. HM. I'M A BIT INSANE. And if I love a song very much there's a high chance that I know all of it by heart lol. So only to name a few: Cha Cha Cha (of course), Évidemment by La Zarra, the entirety of Tekkno album by Electric Callboy, Sakurae by Yuzu, Doubt and Trust by AXS, drop pop candy by giga-p… AND SO SO SO MANY MORE. IT'S A RUNNING GAG IN MY HOME THAT I JUST KNOW SONGS BY HEART. Like I've taken 1 (one) year of spanish classes when I was twelve and last year I got a new coworker who is colombian and so I tell her that I know one song in spanish and I sing the entire song I HADN'T HEARD IT SINCE I WAS TWELVE YET THAT SHIT NEVER LEAVES MY MEMORY SEND HELP MY BRAIN IS TOO FULL OF SONGS. (It was Un monton de estrellas by Polo Montañez if you're curious lol)
- Weird, funny, crafty! I think hahaha
7 notes
·
View notes
Text
“Ah, a shooting star! They say that anything you wish for when a shooting star passes will come true. How about we make one right now!”
Name: Faye “Yuu” Estrellas (Though, She normally goes by Faye ) Pronouns: She/They
Nicknames: Herbivore( Leona ) , Little Shrimpy (Floyd ), Mademoiselle Trickster ( Rook ), Little Beastie ( Malleus ).
Age: 16
Birthday: April 16th
Height: 157cm
Gender: Female
Family: ???
Homeland: ???
Twisted From: N/A
Class: 1-A
Dorm: Ramshackle
Occupation: Student
Club: N/A ( but she’s looking to join one! )
Best Subject: N/A
Dominant Hand: Right
Favorite Food: Grilled Cheese Sandwich
Likes: Music, writing, decorating, cute things, and pastel colors.
Dislikes: Rude people, Messes, Cockroaches and most bugs.
Hobby: Writing
Talent(s): She actually has a pretty good singing voice,it’s just that they’re very insecure about it.
Personality: If you asked people to describe Faye, the answers would vary, some would say she’s a bit of a klutz, others would say that they try their best with what they have But, one thing for sure is that Faye is the most exuberant member of ramshackle dorm, constantly bursting into songs from her world while cleaning around the dormitory, or hoarding all the pink and cute things they can find. Nevertheless,Faye has a heart of gold and always treats people with kindness and respect ,so long as they treat her with the same respect they give to them.
Backstory:
[ AN OLD BOOK OF FAIRYTALES APPEARS BEFORE YOU,MAGICALLY TURNING TO A CERTAIN STORY..]
The Sick Girl and Her Wishing Star
“ Once upon a time, there was a young girl.
She was like all the other girls, she liked the morning and the sun and hated the dark, and she loved to imagine and play pretend.
But, this girl was quite sick, and was confined to her room. She was very sad that she couldn’t go out to play like the other kids, but she settled with what she had, her imagination.
Everyday, she was someone different, a Princess one day and an adventurer the next. It was the most she could do, the closest the young girl could get to the outside world.
One night, the young girl looked out the window,noticing that a shooting star had just passed by. Her eyes lit up as she made her wish.
‘ ‘ I wish that I would stop being sick, that I could finally be able to go outside and play.. I wish I could be like a Princess, and be saved from my room by a handsome knight, so that I can finally be free.. ‘ ‘
As the girl laid her head down and drifted off to sleep, she heard someone whispering into her ear.
‘ ‘ Don’t worry, your wish has been granted.. ‘ ‘
And so the girl- “
[ THE BOOK CLOSES, AS IF NOT WANTING YOU TO READ ANYMORE..]
TRIVIA
If you couldn’t tell,Faye is largely based off of me and my personal issues, though ,I don’t have an illness myself. (Thank god)
Estrellas is Spanish for stars
Though Faye isn’t twisted from anyone,I took inspo from a couple Disney princesses for her personality.
She’s also a tad bit based off the star in Pinocchio ,like the smallest bit.
#Faye “Yuu” Estrellas#twst self insert#twst mc#twst yuu#twst oc#twisted wonderland oc#disney twisted wonderland#twisted wonderland#faye’s ocs#faye’s adventures in wonderland
12 notes
·
View notes
Link
Local Teen fed up with Friends' Shit, Local Friends Having a Spat, Local Friends Fight a Ghost Instead of Each Other, Local Team of Youths Perform Exorcism
When Danny got to school, his friends were bickering, walking down the halls to their lockers stuck in a cyclical argument. “This school needs change and I’m going to make sure it happens!”
“Nobody wants this but you and your vegans!”
“It’s healthier for you, better for wildlife and livestock and does less damage to the environment!”
“People literally need meat products in order to live, what about them?”
“There are supplements that can stand in for meat without slaughtering innocent animals that have no choice in whether they get murdered to feed us!”
“Just like you’re giving us no choice in our alternatives?”
Danny couldn’t stand it anymore and got between them both. “Estrellas arriba, shut up! Go to class! No one wants to hear this screeching in the halls!” Tucker and Sam both stared at him wide-eyed and red-faced but Danny was already pushing Tucker away since Sam was usually immovable. “I can’t believe you guys. You’re both so clever - how can someone so clever be so stupid? How do you spend a week arguing over a temporary change that’ll never take hold?” Sure, Danny’s angry ranting in Spanish may have been getting him stares but that’s what his hoodie was for and he was too annoyed to care. Once they were in class, Danny went quiet and pulled out his sketch pad to lose himself in drawing whatever first came to mind. Hydra, the largest constellation in the sky, soon decorated the page until class actually started.
As the day progressed Danny shot out an argument on both sides and pulled his friends away from each other when they started yelling, determined not to deal with their bullshit more than needed. By the end of the day he’d had to come up with several new star-based swears because regular cussing didn’t cut it anymore. “Gods, I can hardly get to lunch without a Denobola shouting contest! You two deal with this without me!” Heading outside to eat his packed lunch in peace, Danny took solace in his last period being one without his friends. Who knew my least favorite class would be my only peaceful one? Those two better be done with this soon.
A cow float, a stage, a ‘meat on a stick’ stand, kids in steak and hot dog costumes, a guy with a grill that couldn’t possibly be legal to just put on school property, and a sign that read “United we eat meat.” These were the first things Danny saw when he got to school. Then he looked over at the other side of the schoolyard. A replica of the Mystery Machine, the biggest fake sunflower he’d ever seen in his life, and yet another stage were set up with people that Danny could only identify as hippies surrounding that stage with picket signs with “It’s easy being green,” and “Tofu for you” written on them.
“Literally, how?” Danny groaned as his friends both approached him, looking furiously determined and holding megaphones. He could feel the cold burn of his eyes flashing brilliant green once they were both in front of him. “Seriously, how did you even get this done! I know there aren’t that many vegans here at the school who could’ve helped with this Sam, so how’d you get it done?”
Sam rolled her eyes at him, arms crossed. “I paid some people to help us set up the stage on time, so what?”
“…How much money do your parents make that you ca-”
“So you’re a capitalist?” Danny was not going to punch his friend for interrupting him, that’d be counter-productive right now. Even if Tucker’s screeching in his ear nearly made that ear bleed. “You have the money and privilege to chose not to eat meat and you go and condemn the poor people who have to work their asses off to make ends meet and who literally need meat to live?”
“Enough!” Danny put a hand over both of their mouths. “Sam: you’re right, eating meat is bad for animals cause they die. You’re also disregarding the struggles of the poor and forcing your choices on the rest of the school like your parents do to you and like they do to everyone else through money and political power. And you.” Danny whirled around and pointed his finger in Tucker’s face. “This is going to ridiculous extremes. How did you even do this? Don’t answer that, I don’t wanna know. This is only a week-long change, you know that. Parents would’ve complained to the school about their kids being forced into someone else’s diets and the school would never do this again. More importantly!”
Shiver, mist. The sky darkened, the wind whipped up, and Danny swore he could hear cackling from everywhere. He looked over at the truck that Tucker had brought in and grabbed his best friend’s shoulder. “I’m going to punch you later for bringing a stars damned meat truck when we’re fighting a ghost who’s obsessed with meat.”
“That was my b,” Tucker admitted meekly. As the meat ripped out of the truck and flew through the air, Tucker and Sam slipped their wrist rays on and Danny ran to and slid under Tucker’s stage. The sound of something huge hitting the ground shook it, and Danny reached inside of himself. That humming ball of cold and void and out of reach stars, he plunged into it, and light washed over his body. The world changed, colors turning vivid and bright, strange colors he had no names for other than non-visible light raced into his eyes. The shadows were no longer black but silvery grey, the vast emptiness between molten starmetal and the blazing suns. Sounds and smells and sensations hit him that were all too alien to process. He reeled, nearly dropping the form. But he had something to do, he had a job to do.
Danny phased into the ground and popped up in front of the meat monster. It towered over him, so large Danny could barely see anything else. A check of his wrist showed that his ray was now pretty much melded into his hazmat. “Weird, question later, ass kick now.”
Tucker was shouting at the rest of the students, his wristray aimed at Agatha but attention on the crowd. “MOVE, GET OUT OF HERE!” Sam grabbed onto Tucker to try and pull him out of the way of an oncoming meat fist but one of the vegans sprinting away knocked her into him and they both went flying onto the grass. A snarl on his lips, Danny charged forward. He lashed out with his foot to the… head, he supposed, of the meat, and it staggered backward away from the student body. She swung at him with a hand that moved faster than he’d anticipated, and Danny went flying. The world faded into unreality and he passed through what he vaguely knew were trees and the ground before stopping and righting himself. He flew under the ground, legs merging into a tail - also to freak out over later - and he zoomed. He emerged right under her and missed his uppercut as she stumbled backward from the rays that Sam and Tucker fired. Another fist grabbed him and Danny was slammed into the ground.
After a failed kick to the hand, Danny concentrated on his wrist ray and lined up the trigger that was sitting comfortably under his glove. Pull and - Agatha screamed from within her monster host, and Danny flew free. His ray was clearly bigger than the others, but he also felt drained. “Reserve for bigger fights.”
Danny weaved around her next few blows, kicking and punching the construct of processed meat backward away from the fleeing students and his friends. Flying in circles to orbit the monster, Danny picked up speed and slammed his foot into the head of the meat pile and it toppled to the ground.
Danny took a moment to breathe, glad to find he could if he didn’t think too hard about it. A fist came into view and Danny went soaring up and up and up. He saw a plane fast approaching and moved into that safe spot between the world and everything else. He passed through the plane like it was a thin cloud of smoke before managing to stop. Then he dove, turning solid again when Agatha was in sight from within her meat construction. “Not a lot of mass but anything with this kind of velocity should do the job.”
BOOM
In the center of the crater, at least as deep as Danny was tall and twice as wide, a splatter of green pulled itself back together into a black and white-suited Danny Phantom, blue skin bruised a sickly purple-black where his cheek had impacted the ground. Picking himself up, the teen rolled his shoulder until it ached a bit less and saw Agatha there, staring at him. “Oh dearie, are you ok?”
“Surprisingly.” Danny rolled his neck. When he focused in on Agatha - he really could just see everything couldn’t he? - her face was warped and stretched larger than the rest of her.
“Tough! You being ok isn’t part of my balanced breakfast of death!”
Smaller chunks of meat came together into constructs about three-quarters of Danny’s size, five of them in total, and they grinned at him. This was when Sam and Tucker caught up with everything, apparently. Danny spun, heel tearing through the creatures like a knife, and landed to see Agatha being pushed back by Sam and Tuck’s wrist rays. “Fuck yeah!”
Danny’s celebration was cut short by his grasp on that deathly cold void slipping in the excitement, light washing over him with the warmth of being alive again. “This is inconvenient.” The meat monsters grabbed onto Danny’s limbs, reminding him that they were mere extensions of Agatha’s will. “This is even less convenient, how about no?”
As Danny was dragged through the air, something smacked him in the face. Catching it before it could fall out of reach, Danny felt a minor bloom of relief. “The Thermos! Maybe I can get it to work!” Seeing his family below, Danny hoped to all the stars in the sky that he was just going for a ride.
The ride stopped. Danny was dropped. A scream flew from his lungs, and Danny reached deeper, desperately grasping, to pull himself into the chill of the grave. The abyss met his call at the same time that his family looked up at the blur fast approaching. “Thanks for the thermos!” He shouted as he dove into the ground. Not waiting to see how that was handled he resurfaced to find Sam and Tucker bound in mounds of meat. “Work. Please work.” Danny aimed the thermos, poured his own cold heat shadows into the thing, and hit the button. A flash of blue light, a scream of defiance, and he capped the thermos. Gravity and heat washed over him again and Danny let out a sigh of relief, running over to pull Sam and Tucker out of the meat piles. “You guys ok?”
“I have meat and blood everywhere and I was nearly crushed to death.” Sam shuddered, even as Danny phased everything off of her. “I am the very definition of not ok.”
“My nightmares are scarred for life after that. That was freaky. What do we do with her?” Tucker’s voice sounded more robotic than Danny liked, he’d have to do something to help him back to normal.
Before Danny could answer that he heard footsteps and turned the thermos invisible. As he thought, his parents thundered toward him with the Ghost Finder in hand. “Just missed em, guys.” Danny pointed behind him and was relieved when his mom and dad jogged off after a nonexistent ectosignature. “Well, that was a shitty start to the day. We should go inside before someone makes something out of the crater here.” Danny, Tucker, and Sam all headed off to the nearest entrance to the school, thoughts going south. “What if the security cameras caught all that?”
“Oh, no, that you don’t have to worry about,” Tucker said. “I’m all over that in like, a couple of hours tops.”
“Good.” Danny waited until they’d gotten to their lockers, and stuffed the thermos into his bag before punching Tucker in the arm. “That is for bringing a stars damned meat truck when there was a food-obsessed ghost flying around!”
“Alright, yeah, that was stupid of me.” Tucker nodded. “I shouldn’t have done that. But uh, we all agreed not to do stuff that affects literally everyone without consulting each other?” Tucker and Danny both looked to Sam, who glared at them heatlessly.
The goth sighed and leaned heavily on Danny. “Alright, fine, ask people what they want first. Lesson learned. Can we talk about what we’re gonna do with Agatha though?”
“Well, I don’t think she’s a mindless monster or anything,” Danny started slowly as they walked toward their homeroom. “I think we can reason with her. Show her that change can be a good thing when it’s done right.”
“Alright, we can do that once we’re sure she’s not gonna try and kill us though, right? Tucker tried to go for a neutral, slightly teasing tone but Danny could hear - could feel a shakiness to him. “We are meat if you didn’t notice Danny, and I don’t know if her control over food extends to a cannibal’s diet. I don’t wanna find out.”
“I’m horrified and grossed out,” Sam groaned. “I’m all for not getting cannibalized. That’s the wrong kind of macabre for me.”
Danny shook his head, made some crack about how bad either of them might taste, and promised to let Agatha cool down before releasing her. “Now, Sam, about how you’re using your money to muscle people around.” Danny groaned as loudly as he could and Tucker waved him off anyway. “No no, she’s an activist and all that shit, she knows how capitalism effects the working class and the attitude that people can just get by without animal products..” Danny pushed both of hs friends forward while this conversation happened. It was going to be a long day.
That cooldown time happened to be the amount of time it took for the veggie week thing to run its course and be done with. The school was cleaned, though all the vegan students who’d showed up for the rally were questioned about any kind of explosives they may have tried to sabotage the meat truck with and the news settled in on a gas line story. Saturday arrived, and the trio all met up in the park. Away from all the dog walkers, readers and normal people having fun outside, Danny Tucker and Sam stood in a small clearing of trees, a few chipmunks shifting around above their heads and in the bushes.
“Tuck, you got the reports?”
“Roger. Sam, got your wrist ray ready?”
“Of course. Danny, remind me to tell your parents they’re awesome for making most of their stuff solar powered.”
“They hadn’t figured out how to tap the afterlife for energy yet, it’s the most efficient thing we got.” Danny shrugged. He pulled out the thermos, which hummed beneath his fingers with the contained energy of Agatha inside. Sam and Tucker couldn't feel it, so he chalked that up to another ghost thing. “Alright, Agatha, if you’re ready to talk to us, I’m gonna let you out now.” The thermos offered no response. Danny opened it anyway.
The bark on the trees darkened, the leaves turning grey and the branches and bushes rustling as birds and squirrels left in a hurry. The air turned colder and sharper, and the sunlight dimmed as green spilled out of the thermos and stained the air. Agatha took shape quickly, though her glow was dimmer than it had been before. Her eyes raked across all three of them and narrowed. “Well, children? You kept rambling on and on about talking whenever I tried to get out. What’s so important that you didn’t put me back in the Ethereal Plane?”
Tucking the name of the other side in the back of his mind, Danny offered his best-placating smile. It disarmed most teachers back when he wasn’t having as many problems, he was hoping it’d work here too. “Agatha, hi. I’m Danny, this is Tucker and Sam. I feel like we got off on the worst foot before, what with you trying to kill us and all.” Tucker elbowed him in the ribs and Danny shoved him back. The buzzing in the air grew louder, his skin tingled, and some small part of his brain kept screaming to shoot, to run, to do anything that could get this thing that did not belong away from him. “So, I understand why you were angry.”
“You, Sam, changed the menu to just one food group!” Agatha’s voice was rising to those terrible echoes in the mind, and the tiny voice got louder. Still it was ignored.
“I understand now that it was probably a bad idea. No one’s been going to the line in the cafeteria all week except fellow vegans,” Sam grumbled. “Still though, some change needed to happen. The cafeteria wasn’t giving us any healthy foods!” Sam was a good actress when it came to her voice. She sounded unafraid, ready to argue for hours. Danny could feel something off though.
“And healthy diets aren’t exactly easy to come by if you don’t put a lot of effort into it nowadays.” Tucker held out a sheaf of papers. “This, Miss Reece, is a report on the various health crises around the country because of the food they’re feeding us.” The papers were taken and Tucker let out as subtle a breath as possible. “I don’t agree with changing the menu to just one food group, no one in their right mind would. But I think we should still change things up. Is there any way you can help us do that?”
There was a long beat of quiet, where all that Danny could hear was the sizzle of patties on a grill, the crunch of lettuce being pulled apart, the chopping of a knife on a cutting board the came with Agatha’s presence. It was in the background of everything unless he focused. It was still there though, and it was so distracting with everything else happening. Agatha read, frown deepening as she did before she handed the reports on obesity and diabetes increasing in children of their ages and lower back to Tucker. “Alright,” she started, then stopped. A superfluous breath. She looked to Danny. “Well, I suppose that I was a tad extreme about everything. How about this?” She held out her hand, and above her glove, the green light that seemed to shine in all directions from her coalesced into the form of a burger. “I’m not sure they’ll accept me in the school kitchens again but I’m certainly able to make a meal for everyone.”
“That’s amazing!” Tucker crowed. “I’ve already sent a few texts and set up some online polls to find out what most people actually want out of their lunch, maybe you can help us with finding ingredients around Amity? Do you have a food sense?”
“Even if they don’t let you into the school’s kitchen you could still probably find a soup kitchen that’d definitely let you in,” Sam offered. “If you can create food from basically nothing, then I see no reason for them to turn you away.”
“Plus, since ectoplasm draws energy from heat and electricity, you can probably just relax in the sun and be able to pull out a full course meal.” Danny took in his friends’ curious looks and scratched the back of his neck. “My parents are the world’s best ghost scientists. I just asked them.”
“I’ll certainly look into that soup kitchen idea dearies,” Agatha said with a bright smile on her face. “For now though, I should be getting back to the Astral Plane. Sunlight is a nice substitute but after all that fighting I need a quick break.”
“I can get you back there without my parents noticing,” Danny offered.
“I only need to be invisible for that, dear,” Agatha assured them and faded out of sight. The chill and fading of the clearing dissipated, and Tucker and Sam relaxed visibly.
“Well,” Danny said as he pulled his notebook out of his bag. “That’s one ghost down.” He hoped it wouldn’t be too many till he convinced his parents.
Ao3
#Danny Phantom#Danny Fenton#Sam Manson#Tucker Foley#Agatha Reece#Lunch Lady#The Lunch Lady#Lunch Lady Ghost#The Lunch Lady Ghost#Jack Fenton#Maddie Fenton#Jazz Fenton#fanfiction#Phanfiction#fanPhiction#Phanfic#fanfic#fanPhic#PhanPhiction#PhanPhic#Rexy Writes#MCS
7 notes
·
View notes
Text
(Here’s something for my RP account. It was submitted to this account)
𝐒𝐏𝐄𝐀𝐊𝐈𝐍𝐆 𝐇𝐀𝐁𝐈𝐓𝐒 .
𝐍𝐀𝐌𝐄 . Nathalia Estrella Soylette
𝐒𝐏𝐄𝐄𝐂𝐇 .
# of spoken languages: 1 / 2 / 3 + (English, Spanish, Amazonian) tone of voice : high / average / deep accent : yes: New England/Maine American / sometimes / conditionally ( feigned ) / soft / no/ Colombian
demeanor: confident / shy / approachable / hostile / other posture : slumped / straight / stiff / relaxed (when stoned) habits: head tilting / swaying / fidgeting / stuttering / gesturing / arm crossing / strokes chin / er, um, or other interjections / plays with hair or clothing / hands at hips / inconsistent eye contact / maintains eye contact / frequent pausing / stands close / stands at distance
𝐂𝐎𝐌𝐏𝐋𝐄𝐗𝐈𝐓𝐘 .
vocabulary: ◼ ◼ ◼ emotion : ◼ ◼ ◼ sentence structure : ◼ ◼
𝐏𝐑𝐎𝐅𝐀𝐍𝐈𝐓𝐘 .
frequency : ◼ ◼ ◼ creativity : ◼ ◼ ◼ ◼ bold all that apply : arse. ass. asshole. bastard. bitch. bloody. bugger. bollocks. chicken shit. crap. cunt. dick. fakakta. frick. fuck. horseshit. motherfucker. piss. prick.putz. schmuck. screw. shmegegge. shit. shitass. son of a bitch. twat. wanker. Bullshit. Cocksucker. given proper religious context : christ on a bike. christ on a cracker. damn. goddamn. godsdamn. (bloody) hell. holy shit. jesus. jesus christ. jesus h christ. jesus h. roosevelt christ. lord sithis have mercy. jesus, mary and joseph. sweet jesus.
𝐓𝐇𝐈𝐒 𝐎𝐑 𝐓𝐇𝐀𝐓 .
contractions or enunciation ? straightforward and cryptic ? jargon or toned ? complexity or simplicity ? finding the right word or using the first word that comes to mind ? masculinity , neutrality , or femininity ? formalities (when she was queen) and abrasiveness ? praise or equivocation ? frankness or lies ? name-calling or magnanimity ?
𝐈𝐌𝐏𝐎𝐑𝐓𝐀𝐍𝐓 𝐐𝐔𝐄𝐒𝐓𝐈𝐎𝐍𝐒 .
do people have a hard time understanding your character ? almost always / frequently / sometimes (accent thick when angry) / rarely / never does your character’s point come across clearly when they speak ? almost always / sometimes / rarely / never would your character initiate conversations ? almost always / frequently / sometimes / rarely / never would your character be the one to end conversations ? almost always / frequently / sometimes / rarely / never would your character use whom in a sentence ? yes / no / only ironically your character wants to make a counterpoint , what word do they use ? but / though / although / however / perhaps / mayhaps how does your character end conversations ? walk away / ask if that’s everything / say that that’s everything / give a proper goodbye / tell their company they’re done here / remain quiet / they don’t how does your character address others ? titles / first names / surnames / full names / nicknames what social class would others assume your character belongs to , hearing them speak? ?upper / middle / lower in what ways does the way your character speak stand out to others ? accent / vocabulary / tone / level / politeness / brusqueness / speed / it doesn’t/ Other:
3 notes
·
View notes
Text
“i may not know what i am anymore. But i know who i am”
“i saw her hand reaching down for me, and i knew i had to take it”
《♡♡♡♡》
FOR ONCE THE COLOR COMPRESSION DIDNT FUCK ME OVER. IT ACTUALLY LOOKS GOOD.
♡Name: Jerico Lazaro Alvarez
♡Age: 20
♡Abilities♡
♡Class: offense
♡genderfluid/bisexual/polyamorous
-> Nebula:
♡Born in: Buenos Aires, Argentina.
Deploy a cloud of Galaxy as a smoke screen
->Blinding Star:
Throw a stunning orb of light.
-> Sunray Bow
Shoot various arrows made of sunlight. As a secondary ability you can shoot a charged arrow that deals more damage.
♡Abilities (Jericannon. Aka actual cannon)♡
-> speaking with animals
->shapeshifting (animals)
-> wall phasing + invisibility (can make people just dont perceive her)
->Empath powers (can feel others feelings)
->Flight (aka fuck gravity)
->Speaking with animals (Applies to kirikos Fox spirit and hanzo/genjis dragons)
-> super speed
->"Sunlight form" (full on cosmic being)
Biography:
Hailing from Buenos Aires, Argentina, "supernova" was raised as the oldest sibling of four, shes fiercely protective of them and those she considers family.
They powers were given by a an entity they reffer to as "Estrella" (star in spanish). On their fifteenth birthday, while staring at the stars they heard a voice call forth to them, saying "of all the humans I met youre the most bright soul of all of them, your strenght,your adaptability, yes, you are a perfect vessel for my power, use it Wisely, sunlight", And saw a hand reaching down for them, it was massive, they took the beings hand and passed out.
He was found by agent Genji after various witnesses from around the world reported similar sightings of "the Sky opening up" galaxies visible even with light pollution, a flash of light running through the streets and sounds of animals that werent Native to the region.
Genji convinced Xem to join Overwatch, promising xem and xeir family would be well taken care of.
《♡♡♡♡》
Taglist: @tex-treasures @malewifepatrickbateman @mercuryships
Only mutuals allowed to reblog.
0 notes
Text
Hey did you know that when I was away I made a bunch of headcanons
Did you also know I forget to post them everyday
- Hamano was, technically, the first one to confess, but he decided to do it in such a casual manner that Hayami thought he was kinda joking (he probably did it after training or while they were fishing), but Hamano kept saying 'I love you' over and over, and Hayami, being who he is, just turned his head around, saying 'okay, okay' or just plain blushing and walking away. It was one day they were walking back home that Hamano tried to confess once more, only for Hayami to be annoyed because he 'didn't mean it seriously' and that he 'should stop playing with his feelings'. But Hamano stopped walking, held Hayami's hand and looked at his eyes, and with a serious expression he said 'But I do love you. For real'. And at first Hayami couldn't stop staring at Hamano, but then realization hit him and Hamano was the only thing he COULDN'T look at. Long story short, it was a mess, but at least they were dating now
- I've written so many confession fics on my head this is like one out of a million
- The only way for Hamano to study is having Hayami near, because he would leave it for later to never really do it, and Hayami insists that he does, and that they won't really do anything else until they're both done with homework/studying - And speaking about that, Hamano is good at History, because it's something that Hayami loves (when they were studying ancient China Hamano discovered that Hayami knew more than any teacher. Ever. Isn't he so cool) and when he rambles about it Hamano tries to pay as much attention as he can, and something always stays with him, so it's easier studying History
- HAVE I MENTIONED THAT HAMANO HAS CANONICALLY WRITTEN POETRY CAUSE. HE DEFINITELY HAS WRITTEN SOMETHING FOR HAYAMI
- These two planned their wedding when they were children, Hamano brought it up some random day and Hayami was embarrased because 'we were children we didn't really know i mean i don't think we're getting married anyways' and Hamano basically excitedly screams that 'no!!! We'll marry because we love each other! And we will wear pretty dresses! And we'll invite the whole team! And the fishing lady!' so they spent the whole afternoon planning it over again (only one thing was clear after the planning: Kurama would be the flower boy)
- Hayami once called Hamano 'Kaiji' accidentaly and both of them died internally
- Hamano is SOOOOOOOO into the idea of double/group dates. It all started when Ichino and Aoyama called them over for a group thing and since then he has loved hanging out with other couples
. - ... Which obviously led to Hamano wanting to hang out with Minaho and Manabe - And Hayami was okay with it but internally he was hella nervous because Minaho and Hamano are VERY good friends and he has only talked to Manabe like... Twice, maybe, when Earth Eleven came back and they held a party n stuff, so he thought that the date would be basically Minaho and Hamano talking about whatever while he and Manabe stared at each other awkwardly
- But the double date was fun and everyone talked to everyone and Hayami found out that Minaho and Manabe are really really really nice people to hang around - So they hung out more often (but not that often because Minaho and Manabe live away, sob)
- and they started dating each other. and kurama. and kurama is also dating hikaru and kariya too. kurama has a lot of boyfriends
- Hayami is actually very into videogames, specially rhythm ones and RPG's (story heavy ones in general). He introduced Hamano to the Rhythm Heaven franchise because he thought he would love the quirkiness of it
. - AND HE DID HE LOVES RHYTHM HEAVEN SO MUCH. Hayami bought him The Best+/Megamix for his birthday and Hamano almost choked him because he hugged him too thightly
- Because I'm obvious, at some point Minaho, Manabe, Hamano and Hayami go to England for their honeymoon and Hayami and Minaho have to make sure the other two are with them all they time because they are absolutely horrible at English and they can't be left alone
- Hamano and Hayami have sleepovers all the time. And there was a time when both were super awkward around each other because they were starting to fall for each other and were sUPER SLOW to realize. So anyways, Hayami told Hamano to sleep somewhere else and at first he did go to another room but sometime later he came back because 'Hayami if I want to see you early in the morning I'll just get up earlier and come here but if I stay I want to wake up with you and all...'
- You can pinpoint the moment Hayami died internally. - But he agreed. And while he was sleeping lying on Hamano's chest he Realized™
- fuck i should write that
- Speaking of Hamano and Hayami being slow, my brother and I have this AU in which Kurama is Hamano and Hayami's son, and a time traveller who came to this time to ensure those two get together so he can exist in the future and all
- Kinako and him bonded over being time travellers sent to take care of family members and then both joined the Shorty Brigade with Shinsuke and Konoha
- Also he has a younger sister named Estrella (I like to nickname her Suta for some reason)
- i think suta is a boy name heck
- Hamano can carry Kurama and Hayami at the same time. He's quite proud of that.
- Okay so some people talk about Tsunami adopting Hamano but hear me out. NORIKA ADOPTING HAMANO. [And now the best headcanon is Kogure and Haruna adopting Hamano]
- I somehow have the headcanon that Hayami likes Vocaloid and my mind jumped to him dressed as Hatsune Miku save my soul
- I recall Kurama saying something on the games that made me think he likes wearing skirts/dresses but I can't remember what it was
- But yeah Kurama likes wearing skirts and dresses
- I looked for it and now I know. (This is what he said on the Spanish ver and through time and experience I learned that translation differ from each other... A lot) They were talking about the Middle Age clothes (when they went to Jeanne's time n stuff) and Kurama just said that 'I don't know, it's like wearing a dress, right?' and it gave off such a casual vibe that I started that headcanon
- Maybe I'm reading into it too much
- But he would look adorable in dresses don't lie to me
- When they grow up, Hamano works as a preeschool teacher and Hayami works as a biology/history teacher, in higher levels of education of course - Au in which all 5 of my ot5 work as teachers. Manabe is obviously a math teacher. Kurama can take the biology away from Hayami idk, he likes animals. My Philosophy teacher sorta reminds me of Minaho so there but he could also teach Psychology
- The whole school starts suspecting about Hamano and Hayami because _why would a preeschool teacher hang around teachers who teach (? older kids_ but then Kurama comes along, and then Minaho and then Manabe and aaaaaa
- The whole school ships it. There used to be arguments regarding who matched better with who but they kind of died when all 5 started dating. There were discussions regarding who the cutest were, though
- On the alternate timeline where Sakka is Dead and no one joined the Sakka club, Hayami starts dating Aoyama.
- But it feels weird because even though he really likes Aoyama he gets this feeling that it's just because he's the closest person he has.
- And there's this guy on his class, Hamano. He is a rather quiet kid (although some of his classmates would beg to differ) and sometimes he asks for his eraser or tells him good morning when he arrives and it's so SO weird, because he feels as if he SHOULD know him, and he SHOULD feel a certain when he looks at Hamano or when he talks to him, like they knew each other but forgot, like they have or had something together. But if they ever had something, it's gone.
- And this other guy, Kurama, who is on his class too. He's quite rude, stubborn and doesn't really talk to anyone unless he is required to. The kind of person Hayami doesn't really like, and yet, for some reason, he can't get angry at him. He has caught himself smiling at how the smaller boy pouted when he couldn't answer a question correctly. Sometimes, he'll look at his only visible eye (what kind of fashion statement is that, Hayami wonders) and see things deeper than just the black that it seemed to have.
- I JUST LOVE THAT ALTERNATE TIMELINE SO MUCH IT'S TOO ANGSTY SOB - But Hamano and Hayami do end up meeting each other, they sit together for a whole month. - Hamano makes Hayami laugh at one point and he's like 'bjmljgxfbc who are you why is your laugh so cute omg why can't you laugh more often your smile is so precious too i'm sOB'
- Hayami is flustered because 'what he said wasn't even that funny wHY AM I LAUGHING SO MUCH' but he can't really stop and aAAAAA
- But after sitting together they don't really talk that much because yeah, being with one another was fun but there is really nothing that ties them together, so they lose contact
- Oh look at that I can write angst after all. Nice.
- On a not so sad note, Hamano is the biggest fan of cuddles and affection in general ever on existence (or at least out of his boyfriends) like he could be walking down the street with Kurama and he has to hold his hand and give him a kiss on the forehead (Kurama hisses at him but he feels blessed he's just not really into showing it) or fishing with Hayami when he tells him to sit on his lap (or just outright goes and sits on Hayami's) before resuming fishing (Hayami hesitates a bit to put his arms around Hamano but when he does Hamano and I thinks it's the cutest thing) or hanging out with Minaho on his room and he hugs Minaho so thightly and Minaho pets his hair and hugs him back, or reading with Manabe when he puts his head on Manabe's shoulder, and Manabe has to close the book because he's getting sleepy as well so they lay down and cuddle together until they've both fallen asleep.
- Then one of the other three comes to join them.
- Usually the first one is Kurama, and because he is the smallest and thus the most huggable he is always in the middle. Then it's Hayami, who takes off Manabe's glasses because sOMEHOW he forgot to take them off to sleep. He unties his hair and lays wherever he's closest to. He's tired. Minaho is mostly the last one because he's a night owl eEHEHEHEHE. He gives everyone night kisses on the forehead and falls asleep quite fast, actually.
- THEY'RE SO BLESSED AND I'M SOB
- Speaking of Hamano getting sleepy, he can't go on long bus trips without falling asleep. Cars, maybe, but for some reason he can't go through a long bus trip without falling asleep.
- Poor Hayami knows this better than anyone. It's like Hamano KNOWS when a trip is going to be long even if no one told him so. And he uses Hayami's shoulder as a pillow. Always. Well, not always, there was one time where the bus moved a biiiiit too much and Hamano fell to his lap
- He didn't wake up because he's THAT powerful
- Anyways, Hayami just stared at him for a few second, then REALIZATION hit him like a truck, and he hoped no one was watching him. On the seats before them, Ichino and Aoyama, both of them sleeping, safe. Seats behind them, the managers, who looked too into their conversation to notice. And the only one he should be worrying about was Akane, who had a camera, but it was okay, he only took pictures of Shindou, apparently. So, safe too.
- And, finally, the seats next to them... Oh, Shinsuke and Tenma, right, they looked interested in their current conversation topic, so safe... Or so he thought because Tenma is shipping trash too, I mean, have you seen how he acts with Aki regarding Ichinose? He ships it, because they looked at him, stared for a bit, gave him a thumbs up and resumed their conversation.
- Hayami has never felt so embarrased.
- And I mean, he could try putting him back lying on his shoulder, but the willpower needed to do that is something that he lacked right now
- So Hamano spent the whole trip sleeping on Hayami's lap
- OR SO WE THOUGHT
- Hamano wasn't asleep when he fell on Hayami's lap, but hey, it was comfortable and Hayami was petting his hair so he might just stay there.
- When he woke up again he looked at Hayami's eyes and said 'Good morning~' like nothing happened and like it was morning
- Hayami's favorite Inazuma Japan member is Kazemaru since he is so fast and graceful, and seemed quite capable too (Although he likes Kidou too, his gamemaking helped Inazuma win. So talented.), Kurama's is Toramaru, because he was the smallest of the team but that didn't stop him from being a great forward, even rivalling the forever-more-popular Gouenji (plus he learns Tiger Drive on Chrono Stones isn't that precious) and Hamano's is obviously Tsunami.
- He even started wearing goggles everywhere since he was a smallie because of him. When they actually met Tsunami was so happy like 'tACHIMUKAI CHECK THIS KID OUT HE'S SUCH A GOOD KID WE SHOULD ADOPT HIM' to which Tachi replies 'Tsunami, you already said you wanted to adopt Tenma, you're going to adopt everyone at this rate' 'YOU ADOPTED SHINSUKE TOO IT'S NOT LIKE TENMA WOULD BE AN ONLY CHILD IF WE ADOPTED HIM' 'Tsumami that's a totally different thing, I just told you that I like Shinsuke's determ-' 'Plus I can't adopt everyone, Tachi! If I ever dared to adopt Kidou's little penguin baby he would kill me!'
- Hamano was just looking at them half 'What is even going on anymore' and half 'TSUNAMI, THE TSUNAMI JOUSUKE WANTS TO ADOPT ME???'
- Hayami is an only son, Kurama has a baby sibling and Hamano is the middle sibling out of three, and the only boy
- that's not me proyecting onto hamano what are you talking about. and headcanoning him as gay instead of bi like everyone else does is not either
- Hayami's parents are not home often so he's home alone most time.
- Or that would be, except Hamano visits a lot or brings him to his house. He has lunch and dinner there most days. And those sleepovers I mentioned earlier? Every weekend, at least once.
- Hamano's family loves Hayami a lot and when they knew they were dating they got so happy they prepared a party
- Hamano's big sister was on first name basis with Hayami before his lil bro
- Hamano lowkey complained about it but his sister just went 'yOU'RE CLOSER TO HIM THAN ME JUST DO IT HE'LL BE FINE WITH IT YOU SLOW DUMMY'
- He wasn't
- 'JNBMCJXJFGHDJHDHCHUVNKGD' - their internal thoughts
- Hamano is close to the Managers, specially Akane
- They have no idea how they came to be this way but they're super close
- Akane roasts Hamano on a daily basis (and that fact is canon) and Hamano tries to get back at her somehow
- 'I could try holding her camera up so she can't reach it'
- Then he remembers he's smaller than Akane
- 'I could ask Hayami to hold it up for me'
- But Hayami didn't want to
- So he asked Kurama to sit on his shoulders because short people STACK together
- Kurama thought it was dumb
- Hamano was a sad bean
- OKAY BUT IMAGINE. Hamano has lots of pics on his wall and half are from Akane and the other half are ones he took himself because Akane taught him The Ways Of Photography
- AKANE DOING HAMANO'S HAIR
- They're on first name basis
- Hamano is actually pretty decent at cooking, specially pastries - Since Kurama absolutely LOVES sweets if he happens to cook some he'll give them to Kurama (and sometimes to Hayami but while he does like sweets he's more on the salty side) - Kurama just dismisses it and says they're okay but he really likes Hamano's sweets
- And Hamano can read him like an open book so he knows too - His face lights up and it's the cutest thing Hamano has ever seen
- Me: I should find a shorter name minamanahamahayakura is too long Me: Uhhh... MiNaHaYaKu Me: [realizes] hOLY SHIT AHAHAHA
- "Minahayaku" - Hayami to everyone, probably
#hamano kaiji#inazuma eleven go#inazuma eleven#hayami tsurumasa#yamana akane#hamahaya#uhhhhhhhhhhh#more people i'm lazy to tag...#my mess#alma writes#FINALLY POSTED#these are mostly hamano/hamahaya and a few platonic hamano/akane and some ot5 goodness
11 notes
·
View notes
Text
Surfing the Dunes of Estremadura from Sao Martinho to Nazaré
Running from the the Spanish border in the north you have what seems like hundreds of miles of Atlantic beach, broken only by estuaries, framed by low dunes which have been colonised by hardy plants. The vegetation is there to anchor the sand against the onslaught of big ocean breakers which would otherwise invade the land behind the dunes. A lot of effort has gone into creating the optimum conditions for the growth of the plants in what is otherwise a hostile environment.
On this coast, Sao Martinho da Porto is an attractive little town about 50 miles north of Lisboa, that sits in a bay shaped quite like Lulworth cove. Except of course this is Portugal where the sand is finer, the temperature more mellow, the houses white with blue painted timber and red tiled roofs, and the ubiquitous ceramic tiles with abstract patterns and figurative scenes. This was the place we decided to pitch at and we ended up staying there three days.
One of the days I wanted to go up to Nazaré and check the town as it is famed for its surfing and patronised by global surfers looking for the big waves that are common in that area. I was set on cycling the distance which is about ten kilometres.
The ride out of Sao Martinho on the back road is straight up for several kilometres and it's a bit teeth gritting at times but worth it for the views back down to the long, long beach below. I could see that just behind the low dunes that back the sea there was a brown dirt track. As Nazaré is situated on a river at sea level I wondered if I could save myself the inevitable climb out of the town on my way back if I took that track. Several kilometres later I made my descent to the river and crossed it and came round a bend into the town.
The first place you come to is the marina which harbours both working and pleasure boats. The dockside area has been laid out as if on a grid for new build. Instead there's an abandoned air, as if demolition rather than construction has occurred. But this was Republic day, a public holiday, and there were enough businesses in place to suggest that there would be more activity after the weekend.
My bike can handle off road and the soft traction of the fine sand, up to a point so I went over to the dunes and along the harbour mole to the lighthouse at the end. Whatever the wild reputation the sea has here, on this day it was as well behaved as a class of kids in front of their head teacher. This was tested by a jet skier who headed for the open sea at full throttle, sending his own waves either side.
Up on the wall a sprinkling of anglers were casting to sea. As I cycled to the harbour end I was put off the huge concrete blocks chucked and stacked to protect the wall. They looked like gigantic trig points upended and locked or not locked together depending on how they landed. They looked messy and inelegant but probably very effective against a powerful sea that would not find it easy to shift them.
I cycled back round the harbour and along the road further into the town. Nazaré is not a great looking place. It has a big beach but there is no wall to separate it from the pavement. While too much demarcation put me off the harbour, the lack of it here put me off the promenade. Holiday strollers ambled up and down wondering what to spend their money on next and a constant flow of traffic looking for parking reminded me of Brighton. I didn't like it and decided to leave.
So back to the harbour with the hope that I might be able to find that track and save myself an up and down journey. But of course there was the river between me and my road south and the only crossing was the bridge on the N242. After following various destinationless tracks around the dunes I went back the way I had come. It was ok though. I was enjoying the exercise, the wind, and just being on the track.
The way took me back to the semi industrial units of the harbour fisheries. Against the wall that holds back the dune I noticed the graffiti I had ignored the first time. Closer inspection showed it had been done by the crews of various craft that had put into Nazaré over the last twenty years or so, with crude renditions of their boats and tag lines. There were people here from Finland, Ireland, Nigeria,Sweden and the dates they had come. On one there was a caption something like: They said you left it much too late. But you said Biscay's just a bay. I wondered what might have happened. Had someone been lost at sea and this a memorial to the loss?
I crossed back over the bridge and as the main road bent round to the left, to the right there was a rough road with a sign pointing out that there was a ruin of a church called Igreja de Sao Giao along the way. I didn't have high hopes for the church when the way to it was a very broken cobbled trail, reducing to dried mud and then sand. I took it. I had to get off and walk the bike, at times climbing up dunes, a good work out I thought as the sweat poured through my shirt. But then the track would reassert itself and my hopes would increase. So past cultivated fields interspersed with scrub and bush, cane and pampas grass I carried on, not accepting this road might run out and I would have to retrace my tracks. Besides I hadn't got to the church yet. The track would at least take me there surely.
I got to the church and was bemused, as it looked like the wreck of an old adobe farm house, something that might have been left over from the set of 'The Magnificent Seven'. What was so special about this that it warranted a sign luring unsuspecting travellers? It did have a low wall of ten arches or so, that looked like it might have had some attempt at restoration. And someone had put a corrugated cover over it such as you'll see in any suburban street when builders are reroofing a house. But that was it.
Later I looked it up, and get this, it's reputedly one of the oldest churches in Portugal, dating back to pre Visigoth times, discovered in 1961 and classified as a National Monument. This isn't just a title. A building has to be assessed as to whether it is given the status of a National Monument. This one seemed to have faded back into the fauna after the initial excitement at its discovery. Maybe it was considered sanctified enough to look after itself. Comments on Trip adviser suggested it is privately owned. Time to nationalise a National Monument I am thinking.
I left the church behind wondering what Sao Giao might make of it all and carried on the track which became less defined as I went with me reduced to walking the bike, slipping back through the deep, soft sand that filled my sandals.
Then I met a jut of hill, and as the man said, there was no ignoring it. I had to climb it. So what I had tried to avoid had come to meet me. Up I went, this time too steep and too rutted to cycle and made my way towards Praia do Salgado. I didn't know this was its name at the time and a closer look at google maps shows the road runs out here except the one you takes you up the hill which also takes you back towards Nazaré! Well let it be I thought, and went down to the beach thinking what the hell, I'll take that hill on from the bottom.
On the beach people were making ready for going home. Signs saying no dogs on the sand didn't stop the disobedience of a dog owner and his big hound going on, while from the beach came another with her pert little mutt. People wiped sand from their feet and repacked the boots of their cars. It was like a klaxon had blown telling everyone to leave. As I turned and tackled the hill they passed me almost in a convoy with farts of exhaust from their cars adding pollution to the sea air my heaving chest was sucking in. This made me more determined to get to the top. And dear reader I am proud to say I made it without having to get off and walk, and found myself on the road I had originally gone to Nazaré on.
And not only that it was all down hill for, as you will remember, several kilometres. Well I must have hit 40mph on the way down as I hardly touched the brakes and I was back at the campsite in no time, sitting drinking an Estrella and recounting my tale to Madeleine.
1 note
·
View note
Photo
" Único concierto europeo… en MIJAS, naturalmente ;-) El Equipo MIJAS NATURAL (Beauty & Hair) encargado del MUA & Hair de nuestra Diva y Madrina TARJA TURUNEN, en un magnífico concierto con MARJUT KUHNHENN, JUHA KOSKELA y ANU RAUTAKOSKI en el TEATRO LAS LAGUNAS el próximo 16 de Mayo. Entradas en http://www.elcorteingles.es/entradas/conciertos-y-festivales/entradas-noche-escandinava-iii-mijas-0000086HX0000086HJ00000853Q 3.40 TV MIJAS NOTICIAS: https://youtu.be/Rri1h-p2hFg TARJA TURUNEN: “While I was studying in Karlsruhe´s Music University, in Germany, in 2002, I became interested in performing Scandinavian and Finnish songs for the Latin American audience. I gathered information about these countries and realized that composers like J.Sibelius or E.Grieg were not so familiar outside the classical music lovers on a more popular level. As I was particularly studying German lied music, I felt there might be a chance to let them know a bit of my music. I spoke with two friends of mine, Ingvild and Marjut and we decided to start organizing a small tour in South America. As a pianist, our dear friend Izumi wanted to join us. Noche Escandinava means Scandinavian Night in Spanish. The reason why we chose this name was obvious at that time: the concerts were going to happen in Argentina and Chile, both Spanish speaking countries. As well, even though we were two Finnish singers and a Norwegian one, the program was going to be based in Scandinavian songs (Norway, Sweden, etc). It was a great success and we felt that the idea behind all this had been achieved. For the second edition of Noche Escandinava, during April and May 2004, we had a change in the line up: Ingvild Storhaug was replaced by Juha Koskela (Finnish baritone) and the repertoire this time, was based entirely on songs from Finnish composers. We decided not to change the name of the group anymore, because so many people knew us already as Noche Escandinava. Finland is not a part of Scandinavia, but despite of that, we wanted to keep our touring name as it was before. It is now, finally, the time for a third tour of Noche Escandinava”. Más info en http://tarjaturunen.com/class/noche-escandinava-mijas/ Evento en FACEBOOK https://www.facebook.com/events/880018645512789/ MIJAS NATURAL Beauty CLINIC & Hair ★ CLÍNICA MÉDICO-ESTÉTICA & TEMPLO DEL CABELLO en MIJAS PUEBLO (Málaga / ESPAÑA) [email protected] / 952 590 823 BEAUTY CLINIC & HAIR, specialized in style, make up, advanced beauty treatments (Aesthetic Medicine) and image consultancy. A place to feel well in, a small oasis of peace where Beauty becomes a reflection of Health and Wholeness. Los mejores profesionales en el campo de la MEDICINA ESTÉTICA: excelencia, calidad y exclusividad. Luz, belleza y trato exquisito en un entorno especial. Centro LPG ENDERMOLOGIE Certified Quality (última generación en aparatología y formación experta) en Andalucía. DMC Radiofrecuencia y Mesoterapia, Fotodepilación IPL Laser, MICROBLADING y Técnico Recomendado AEM en MICROPIGMENTACIÓN (Semi Permanent Makeup) entre los 10 mejores de ESPAÑA. Centro exclusivo REDKEN 5th AVENUE SALON (sólo 10 en Andalucía) y Salón Embajadores KÉRASTASE AMBASSADORS. Con marcas como KERATIN, GHD, ENVIRON, ARTDECO, SHELLAC, CORPORA, Dermotricología KAPYDERM, CARITA… en la hermosa y turística Villa de MIJAS. YouTube MIJAS NATURAL (Beauty & Hair) http://www.youtube.com/subscription_center?add_user=MIJASNATURAL MIJAS NATURAL (Beauty & Hair) entre los 12 MAGNÍFICOS de la PELUQUERÍA en ESPAÑA según MUJER HOY, MEDALLA DE ORO de la ASOCIACIÓN ESPAÑOLA DE PROFESIONALES DE LA IMAGEN, ESTRELLA DE ORO del INSTITUTO PARA LA EXCELENCIA PROFESIONAL, SALÓN VIP para la Revista GLAMOUR, TEMPLO DEL CABELLO para VOGUE y uno de los mejores CENTROS DE BELLEZA en España según la prestigiosa Revista de Peluquería PINNI en FINLANDIA ★ VOGUE ★ HOLA ★ ABC ★ GLAMOUR ★ MTV ★ TELECINCO ★ NELONEN ★ CANALSUR ★ ATLASTV ★ DIARO SUR ★ MIJAS COMUNICACIÓN ★ FTV ★ COPE ★ RTV MARBELLA ★ MLG LUXURY MAGAZINE ★ FOTOPLATINO ★ FUENGIROLA.FI ★ OLÉ LEHTI ★ SUOMALAINEN ESPANJASSA ★ LINDA MAGAZINE ★ PHOTOCALL ★ VEVO ★ RADIO SUOMIPOP ★ RADIO PORI ★ SATAKUNNAN KANSA ★ TIKKA TV ★ ILTALEHTI.FI ★ ISKELMÄ ★ PLONKI ★ CLIPFISH ★ RUUTU ★ AMPYA ★ PINNI ★ BAUR & ME ★ FEMME METAL WEBZINE ★ MÁLAGA FILM OFFICE ★ FINNRADIO ★ MUJERHOY http://www.mujerhoy.com/Belleza/Tratamientos/magnificos-peluqueria-728600052013.html Contamos con un departamento de Psicología Clínica y Transpersonal MENADEL (Frasco Martín) https://www.facebook.com/menadel.psicologia 607725547 Además, si te apuntas a nuestro EVENTO FACEBOOK “MIJAS NATURAL (Beauty & Hair) regala un Cambio de Look” y eres FAN de nuestra WEBFACE https://www.facebook.com/naturalmijas podrás participar en nuestro SORTEO y conseguir un fantástico CAMBIO de LOOK ;-) " - Mijas Natural via Facebook
7 notes
·
View notes
Text
Life #5 (South Park)
Character Sheet
Face Claim:
Basic
Name: Carmencita D. Tweedle
Pronunciation: Car-men-SEE-tuh
Meaning: Little Song
Nicknames: Carmen, Tweedle Dee, Mutt, Snow Bunny
Name Origins:
Carmen: Shortened from Carmen
Tweedle Dee: Used with Tweedle Dum, Middle Initial, and Last Name
Mutt: Racial Slur for Mixed Race (I will actually beat that living shit out of you if you call me this AHEM Cartman AHEM)
Snow Bunny: A weird combination of my love of snow and Kenny’s love of Playboy Bunnies
Titles: N/A
Aliases: Princess Kenny’s Personal Knight, Estrella
Alias Origin: Games with The Boys
Orientation: Heterosexual
Gender: Female
Age: 16
Date of Birth: June 4th
Star Sign: Gemini
Birth Flower: Rose
Meaning: True Love
Birthstone: Pearl
Meaning: Purity
Species: Human
Affiliation: Humans, Freedom Pals
Social Status: Middle Class
Dead?: Eventually
How?: This is South Park probably really stupidly
Last Words: “SHIT!!! WE’RE GOING TO DIE!!!!”
Appearance
Eye Color: Grey-Blue
Glasses/Contacts: Glasses
Skin Tone: Pale with Freckles
Hair Color: Dark Brown
Hair Length: Just Past Shoulder
Hair Type: Curly
Hairstyle: Ponytail Normally,
Loose When Estrella,
Braids When Knight
Height: 5’1 (Yes, I’m short… only means i’m closer to hell)
Body Build: Skinny and Scrawny
Notable Features: N/A
Piercings: N/A
Tattoos: N/A
Scars: Small Mark on Left Cheek
Birthmarks: Thigh
Wardrobe
Style: Casual and Warm
Favorite Outfit: Dark Blue Coat Lined with Dark Grey Fur, Blue Jeans with Black Star Pattern, Black Fur Lined Boots, Grey Gloves with Ugly Sweater Pattern, Gray Knit Hat with Dark Grey Poof, Black Moschino Backpack with Optimus Prime Bear, Star Ring
Formal Outfit: Black Off Shoulder Asymmetrical Dress, Black Kitten Heels, Black Shoulder Bag with Silver Star Print, Silver Star Necklace, Silver Star Bracelet, Silver and Pearl Star Clip On Earrings, Silver Star Ring
Alter Ego Outfit:
Stick of Truth: Grey Tank Top Cut and Sewn Together with Shoe String, Long Sleeve Black Shirt, Black Hoodie, Black Leggings, Black Boots, Plastic Champion Belt, Plastic Gauntlets, Toy Bow and Arrow
Freedom Pals: Black Tank Top, Blue Galaxy Skater Skirt, Black Tights, Black Leather Jacket with Silver Star Pattern, Black Sneakers with Gold Star Pattern, Multiple Silver and Gold Star Bangles, Black Choker with Dangling Silver Stars, Silver Star Crossbody Bag, Silver Star Headband, Silver Star Ring, Black Lace Masquerade Mask
Accessories: Silver Star Ring
Scent: Vanilla, Green Tea
Relationships
Mother/Mother Figure: Roxane Tweedle
Relationships:
My mother is a very strange woman. She is very paranoid and always moving around the town. She is very attentive to my sister and I’s needs and tends to try to give us anything we could want (which doesn’t mean we actually want it). Whatever time she spends with us usually driving us around to wherever it is we’re going and it’s usually spent with us all terribly singing along to the radio and laughing. Mom isn’t one to want to sit and listen to us or to give us advice as she has a short attention span (probably where Olivia gets it from). She might not be the best mother but she does try and I still love her.
Father/Father Figure: Jackson Tweedle
Relationships:
My father, on the other hand, tends to love to sit and listen to (gossip with) us. He loves to try and smother with us with anything we ask for (Olivia and I honestly made it a game to see how far he would go to get us what we wanted… he has to fail). Dad is just as paranoid as mom is but he hides it a lot better. He was also the one that signed me up for martial arts which caused a huge argument between parents. My dad has been known to also beat the shit out of anyone who dares insult us or my mother (probably where I got it from).
Brothers/Brother Figures: N/A
Relationships: N/A
Sisters/Sister Figures: Olivia Tweedle
Relationships:
As dumb as Olivia can be, she is a very loyal friend and sister. I have, obviously, known her my entire life and she has never let me down (In terms of loyalty and reliability not much else). She can deal with my violent tendencies ad overly snarky demeanor. I can (most of the time) deal with her oblivious, careless attitude. We rarely fight and get along better than most sisters do and I’m pretty happy to have her as my sister.
Aunts/Aunt Figures: Nancy Tweak
Relationships:
Aunt Nancy is very sweet. She is always supportive whatever decision we make even if it might not be the right one. She is also pretty good at telling right from wrong and standing up when she thinks we’re doing something terrible. As supportive as she is she doesn’t really listen and is known to just leave us to our devices for long periods of time. She honestly borders on child neglect with how little she pays attention to us or Tweek.
Uncle/Uncle Figures: Richard Tweak
Relationships:
Uncle Richard is much worse than Aunt Nancy. All he cares about is his business and pays no attention to anything any of his family does. That’s not to say he doesn’t care, he does... he just cares more about his coffee shop. He also does anything to boost his shop which includes manipulating us and Tweek to do his bidding. Yeah, I don’t like my uncle.
Cousins/Cousin Figures: Tweek Tweak
Relationships:
I adore my cousin Tweek. As jitter and jumpy as he is I find him absolutely adorable. I’m usually the one to take the late night calls and now late night talks about pressure and Underpants Gnomes. I try to comfort him but it doesn’t always work cuz this kid is riddled with anxiety. When he’s calmer (calmer, NOT calm) he is pretty fun to hang around and his friends are pretty crazy. You wouldn’t think this but Tweek is surprisingly protective of Olivia and I. He has actually attacked some people he thought had hurt us emotionally or physically.
Nieces/Niece Figures: N/A
Relationships: N/A
Nephews/Nephew Figures: N/A
Relationships: N/A
Sons/Son Figures: N/A
Relationships: N/A
Daughter/Daughter Figures: N/A
Relationships: N/A
Current Guardian: The Tweaks
Relationship: I get along well with Aunt Nancy (I mean she tries), I hate uncle Richard (I know for a fact he’s the entire reason for Tweaks anxiety), and I adore Tweak
Current Significant Other: Kenny McCormick
Relationship:
Kenny McCormick was never the boy I saw myself dating. Simply put he was a major player and I wanted commitment.Kenny went around on any girl that moved and I was no exception, however, I was one of the very few who resisted his… charm. That got him interested and he is surprisingly persistent but so am I. It was a long game of cat and mouse where he would find me and drop cheesy pickup lines, offer compliments, and ask me out over and over while I offered sarcastic comment after witty comeback (if I do say so myself). The game turned into a surprisingly close friendship where the flirting got more jokey and less serious, where his true colors showed and that was when I finally caught feeling for the real Kenny McCormick. The overly perverted, vulgar, overprotective big brother Kenny. It didn’t take me to long to ask him on a date and imagine my surprise when this guy decided to actually give a committed relationship a try. I’m glad he did because now I know the jealous, overprotective, poorly timed joke slinging Kenny too. Obviously, we have a very touchy-feely relationship (which is weird because I’m not a big fan of being touched).
People
Mentors:
Advisor: Kyle Broflovski
Confidant: Kyle Broflovski
Teammates:
Stick of Truth: Humans
Fracture But Whole: Freedom Pals
Friends: Stan Marsh, Kyle Broflovski, Tweek Tweak, Butters Stotch, Token Black, Craig Tucker, Jimmy Valmer, Timmy Burch, Heidi Turner (I AM going to beat Cartman for what he did), Karen McCormick
Best Friend: Olivia Tweedle
Love Interest: Kenny McCormick
Rivals: Wendy Testaburger, Bebe Stevens
Enemies: Eric Cartman
Person Hated Most: Eric Cartman
Most Important Person: Olivia Tweedle
Awkward Around: Wendy when she breaks up with Stan, Tweek, and Craig when they’re fighting
Admires: Dad, Kyle
Past
Hometown: North Park
Childhood: Pretty normal, lived in a small town, small house, small family. Then, of course, our parents decided to go on some big trip and dump us with relatives for God knows how long.
Childhood Hero: JK Rowling (What? I like Harry Potter)
Most Important Memory: When my parents finally signed me up for martial arts after months of begging OR When I won my elementary school art competition
Present
Current Location: South Park
Living With:
Occupation: Student
Pets: Wiener Dog/Golden Retriever Mix named Oz
Health
General Health: Meh… I tend to get colds every few weeks
Reason: Apparently I have a sucky immune system
Mental Health: I’d say I’m sane, though, according to others that’s up for debate
Reason: I’m violent and pretty loud once I’m comfortable
Sleep Habits: I sleep like a log
Diet: Umm… I’m not on one
Exercise: Martial Arts, I Ride My Bike A Lot
Allergies: Dairy Products
Injuries: I get scrapes and bruises (I’m kind of a klutz)
Disorders: N/A
Deformity: N/A
Disabilities: N/A
Mutations: N/A
Handicaps: N/A
Medication: N/A
Education
School: South Park High School
Best Class: Art
Worst Class: Biology
Sports: Martial Arts
Clubs: Art Club
Languages: Spanish, English
Memory: Ok, I Guess
Abilities (Fracture But Whole)
List of Powers: Stellarkinesis
Moves:
Gravity Slam: Using the force of gravity to slam and hold opponents to the ground (Kick them in the balls/punch in the boob)
Shooting Star: Bringdown a star from space to hit a target (Chuck Firecrackers at them)
Plasma Beam: Use beam of plasma to harm enemies (Shine flashlight in their eyes)
Stellar Healing: Use stardust remaining from destroyed stars to heal teammates (Neosporin and Band-Aids)
Stardust: Use stardust to confuse opponents (Chuck glitter in their faces)
Abilities
Gravity Manipulation (Basically Telekinesis AKA Imagination)
Stardust Manipulation (Glitter)
Plasma Manipulation (Flashlight)
Origin: As a child, I was taken by a space god worshipping cult who attempted to sacrifice me to their god in a special ritual. Instead of dying, the ritual gave me the power to control the stars and become someone who could protect other children from being attacked and suffering my fate,.(AKA I wear star-shaped ring and own a lot of things with star patterns)
Elements: Space
Strengths: Stars, Night, Evasion, Long Range
Weaknesses: Cold, Water, Over-Exertion, “Nightmares from cult experience” (what the hell does that even mean?)
Restrictions: Over-Exertion of Powers
Immunities: Fire, Light, Sun
Combat
Fighting Style: Quick and Hard, Use Opponent's Strength, Momentum, and Weight Against Them
Weapons: Bow and Arrow (Stick of Truth), Hand to Hand
Personality
Good Traits: Loyal, Creative, Smart, Strategic, Athletic (Fast), Funny, Hard to Get Angry, Romantic
Bad Traits: Snarky, Overly Sarcastic, Explosive Temper, Likes to Hide Bad Feelings, Insecure About Glasses and Relationships, Stubborn
Likes: Animals, Art, Martial Arts, Laughing, Family, Games, Friends, Snow, Stars, Silver, Cheesy Romantic Dates, Reading, Cooking
Dislikes: Getting Angry, SOMEONE Insulting My Friends/Family, Swimming, Hunting, Being Touched by Most People
Turn Ons: Dirty Talk, Compliments, Jokes/Cheesy Pick Up Lines, A Little Rough
Turn Offs: Insults, Silence, Lies
Talents: Drawing, Martial Arts
Sense of Humor: Laughs at Just About Anything
Darkest Secret: Loves Cheesy Pick Up Lines
Does Anyone Know? Who?: Olivia and Possibly Kenny
Greatest Fear: Drowning
Why?: Can't Swim
Other Fears: Cartman Finding Out About Insecurities/Fear/That His Words Sometimes Hurt
Why?: Cartman is Cartman
Most at Ease When: With Karen, Kenny, Olivia, Kyle or Butters (or Any Combination)
Most Uncomfortable When: With Literally Anyone's Parents (They’re all so stupid… how are they even parents?)
Enraged When?: SOMEONE (CARTMAN) Insults My Friends/Family
Depressed When?: I Let My Stupid Insecurities Get to Me
Frightened When?: Getting Too Deep in Water
If Granted One Wish What Would It Be?: That I Didn’t Need Glasses
Habits
Hobbies: Art, Martial Arts, Reading
Instrument?: Nope (It'd be cool though)
Sport?: Martial Arts
Spending Habits: Um… If I Get Excited I Just Buy Shit but I MOstly Hate Shopping
Drinks?: NOPE
Smokes?: EW
Drugs?: EXTRA EW
Nervous Tics: Tugging on Earlobe, Chewing Lip
Favorites
Prized Possession: Star Ring
Color: Silver
Song: When The Day Met The Night by PATD
Quote: “Twinkle twinkle little star, do you know how loved you are”
Movie: Peter Pan
Food: Honey Butter Biscuits
Season: Fall
Book: Harry Potter
Genre: Fantasy
Flower: Stargazers
Flavor: Blueberry
Dessert: Blueberry Coffee Cake
Either/Or
Pessimist or Optimist: Optimist
Pacifist or Fighter: Fighter
Introvert or Extrovert: Extrovert
Proud or Humble: Humble
Messy or Tidy: Messy
Risky or Safe: Risky
Strength or Wisdom: Strength
Flashy or Simple: Simple
Long Range or Short Range: Long Range
Cats or Dogs: Dogs
Hot or Cold: Cold
Book or Movie: Movie
Loud or Quiet: Quiet
Logic or Emotion: Emotion
Work or Relax: Relax
Confident or Shy: Confident
Night or Day: Night
Out of 10
Knowledge: 6/10
Wisdom: 5/10
Motivation: 4/10
Agility: 6/10
Power Control: 7/10
Hand to Hand: 8/10
Long Range Accuracy: 6/10
Offense: 7/10
Defense: 4/10
Reflexes: 5/10
Speed: 7/10
Strength: 6/10
Sociability: 5/10
Bravery: 7/10
Confidence: 6/10
Generosity: 5/10
Endurance: 4/10
Evasion: 6/10
Kindness: 5/10
Creativity: 8/10
Charisma: 6/10
Memory: 5/10
Temper: 2/10
Patience: 8/10
2 notes
·
View notes
Video
youtube
If you’re as fond of slowcore, shoegaze, post-rock, and dream pop as I do (and love bands like Beach House, Cigarettes After Sex, Slowdive, and the such), you’re going to instantaneously gravitate towards this band from Tijuana named Mint Field, too. The duo leave us reeling in a state of total fuzzy, hazy intoxication with their surreal new video for Ojos En El Carro, which literally translates to Eyes In The Car, except I’m all ears for the band’s languorous sound. Ojos En El Carro builds towards a scuzzy plush climax with a deliberate crawl. 21 year old Estrella Sanchez (vocals & guitar) and Amor Amecua (drums nad synths) will be releasing a debut album named Pasar De Las Luces on February 23rd. Though my Spanish skills are still very lacking despite years of Spanish classes in high school, it’s hard to miss the nostalgic romance and beautiful melancholia that manifests in this spaciously haunting song. Follow along with the band via their website, here.
#Mint Field#Ojos En El Carro#music video#dream pop#slowcore#post rock#post-rock#shoegaze#lo-fi#bedroom pop#music#indie rock#indie music#indie#alt#alternative#song
2 notes
·
View notes
Text
Mi Flor
Fandom: Thirteen Reasons Why
Character/Ship: Jeff Atkins x Reader
Warning: Lots and lots of fluff
Writer: Cassie
Words: 1075
Requested by: Anon
Summary: Y/N and Jeff have been dating for 3 years and they talk cute to each other in Spanish and all their friends get mad cause they never know what they are saying
Author’s Note: My Grammarly is freaking out after spell checking this XD. Also, all the spanish is from Google Translate so I am so so sorry if it is wrong
Y/N’s POV
“Buenos días mi flor” (Good morning my flower)
“Buenos días mi amor” (Good morning my love)
I turned from my locker to have my eyes meet Jeff’s blue-green eyes. His smile widened as he pushed a loose piece of hair from my face and kissed me softly.
“I had a dream last night.” He whispered.
“Let me guess. I was in it?”
He laughed lightly and nodded.
“Yes, you were. Eras tan hermosa como el sol, la luna y las estrellas. Como siempre lo eres.” (You were as beautiful as the sun, moon, and stars. Just as you always are.)
I looked down, blushing lightly as he grabbed my math and history textbooks along with the notebooks for them before closing my locker and grabbing my waist. I wrapped my arm around his shoulder with a wide smile on my face, cheeks still rosy.
“You know mi amor, I can carry my own books.” He gave a dramatic gasp and looked to me.
“And let mi preciosa flor (my precious flower) get stronger than me? I cannot dream of mi preciosa flor being anything but her beautiful self.”
“Jeff I’m strong.” I sneered as we stood outside our math class. “And I’m gonna prove it to you.”
“I would love to see that day come.” He smirked, walking into class and to our desks, setting down my stuff before taking his seat.
I sat next to him before leaning over and whispering, “Te lo demostraré esta noche. Y eso es una promesa. Confía en mí, no olvidarás lo fuerte que soy después de lo que haremos esta noche.” (I'll prove it to you tonight. And that is a promise. Trust me, you will not forget how strong I am after what we will do tonight.)
He smirked over at me and whispered in response, “No puedo esperar mi flor. Tal vez no seas tan delicado como te has hecho parecer ser.” (I can't wait my flower. Maybe you aren't as delicate as you have made yourself to appear to be.)
I sat up and turned my head to see Hannah Baker, a good friend of mine, staring at me with joy in her eyes.
“How long have you two been dating again?”
“Three years,” I said proudly, opening my math textbook. She smiled and looked down as the teacher began going over what we did yesterday.
Third Person
“Hey Helmet!” Hannah said, sitting next to Clay with her lunch. He smiled and closed his book, sitting up a bit straighter.
“Hey, Hannah. You’re working tonight right?”
Hannah nodded and smiled, looking over to where Y/N and Jeff were sitting. They were so close, their arms touching as Y/N leaned over, whispering something into Jeff’s ear which caused him to smile and kiss her softly, whispering something back. Clay noticed Hannah’s staring and rolled his eyes.
“They’re almost inseparable. Three years and they are always near each other. And they always talk in Spanish. Mi flor. Mi amor. All the time they say stuff to each other in Spanish and oh my god does it get so freaking weird.”
“What do they say?”
“Nobody has a clue. I even took Spanish and I don’t understand a damn thing they say. Either they are being over romantic or really dirty but nobody knows which one. They do it in class to and the teachers have just learned to ignore it by now.”
“Well, I think it’s cute. They’re so used to each other that they have their own little world. I love it.” Hannah smiled and ate her food as she watched Y/N and Jeff. They held each other’s hands so tightly that you would think that they were attached by super glue. Jeff laughed a bit as Y/N got some ketchup on her upper lip from her burger before he slowly wiped it off and kissed her, whispering, “Mi flor, eres tan desordenado.” (My flor, you are so messy)
“Why does he call her that?” Hannah asked, looking to Clay. “Mi flor?”
“It means my flower. Jeff loves Y/N so much. He thinks she’s a perfect flower, that she is the most beautiful and fragile thing on this whole planet.”
“Does he say it often?”
“Often enough that it could be a second name to her.”
Hannah nodded as Y/N and Jeff got up, walking down the hall hand in hand.
Y/N’s POV
“Eres tan hermosa, mi flor. No puedo imaginar nada sin ti.” (You are so beautiful, my flower. I can't imagine anything without you.)
“Oh mi amor. ¿Cómo tengo la suerte de tenerte? Eres increíble y cariñosa y te amo.” (Oh, my love. How am I lucky enough to have you? You are amazing and caring and I love you.)
Jeff smiled and held my hand tightly as Justin and Zach sat across from us, opening their books. Jeff grabbed a pen from my bag and handed it to me as I opened up my notes, smiling widely to him as I looked at his folder.
"Jeff, ¿terminaste la tarea?" ("Jeff, did you finish the homework?")
"Sí, lo hice, está en mi libro de texto.”("Yeah yeah I did. It's in my textbook.")
I opened Jeff’s textbook and got his homework as Justin and Zach stared at us in shock. I looked up and tilted my head.
“What?”
Justin chuckled and shook his head as Zach huffed.
“You guys haven’t said a word of English in the past 10 minutes. Do you realize that?”
I shrugged and said.
“Good. For once we can have a private conversation.”
Jeff squeezed my hand and interrupted me before I could continue.
"Y/N sea agradable. Estos idiotas no importan.” (“Y/N be nice. These idiots don’t matter.”)
I nodded as I dated my paper, holding on tight as he whispered in my ear, "Buena niña. Ahora vamos a enfocarnos en clase y no en lo que te haré después.” (“Good girl. Now let’s focus on class and not what I’ll do to you later,”) Causing me to blush and nod, looking at my paper as we sat close. I knew people stared, but I didn’t care anymore. As long as I had Jeff, I was happy.
#cassiefanfic#13 rw fic#13 rw fanfic#13 Reasons Why fanfic#13 Reasons Why fic#13 reasons why fanfiction#jeff atkins fic#jeff atkins fanfic#jeff atkins fanfiction#jeff atkins x reader
131 notes
·
View notes
Text
Using the Web Speech API for Multilingual Translations
Since the early days of science fiction, we have fantasized about machines that talk to us. Today it is commonplace. Even so, the technology for making websites talk is still pretty new.
We can make our pages on the web talk using the SpeechSynthesis part of the Web Speech API. This is still considered an experimental technology but it has great support in the latest versions of Chrome, Safari, and Firefox.
The fun part for me is using this technology with foreign languages. For that, Mac OSX and most Windows installations have great support on all browsers. Chrome loads a set of voices remotely, so if your operating system does not have international voices installed, just use Chrome. We’re going to walk through a three-step process to create a page that speaks the same text in multiple languages. Some of the basic code is derived from documentation found here but the final product adds some fun features and can be viewed at my Polyglot CodePen here.
Screen shot of the completed Polyglot app with a menu of languages.
Step 1: Start Simple
Let’s create a basic page with a <textarea> for the text we want the page to speak and include a button to click to trigger the speech.
<div id="wrapper"> <h1>Simple Text To Speech</h1> <p id="warning">Sorry, your browser does not support the Web Speech API.</p> <textarea id="txtFld">I love the sound of my computer-generated voice.</textarea> <label for="txtFld">Type text above. Then click the Speak button.</label> <div> <button type="button" id="speakBtn">Speak</button> <br> <p>Note: For best results on a Mac, use the latest version of Chrome, Safari, or FireFox. On Windows, use Chrome.</p> </div> </div>
The paragraph with ID warning will be shown only if the JavaScript detects no support for the Web Speech API. Also, note the ID values for the textarea and the button as we will use those in our JavaScript.
Feel free to style the HTML any way you’d like. You’re also free to work off the demo I created:
See the Pen Text-To-Speech Part 1 by Steven Estrella (@sgestrella) on CodePen.
Adding a style rule for the disabled state of the button is a good idea to avoid confusion for the few people who still use incompatible browsers, like the now-quaint Internet Explorer. Also, let’s use a style rule to hide the warning by default so we can control when it’s actually needed.
button:disabled { cursor: not-allowed; opacity: 0.3; } #warning { color: red; display: none; font-size: 1.4rem; }
Now on to the JavaScript! First, we add two variables to serve as references to the "Speak" button that triggers the speech and to the <textarea> element. An event listener at the bottom of the code tells the document to wait until the DOM elements load before calling the init() function. I used a handy utility function I call "qs" that is defined at the bottom of the code. It is a shortcut alternative to document.querySelector and it selects whatever selector value I pass to it and returns an object reference. Then we’ll add an event listener to the speakBtn object to make the button call the talk() function.
The talk() function creates a new instance of the SpeechSynthesisUtterance object that is part of the Web Speech API. It adds the text from the <textarea>(using ID txtFld) to the text property. Then the utterance is passed to the speechSynthesis method of the window object and we hear the spoken text. The specific voice you hear will vary by browser and operating system. On my Mac, for example, my default language is set to American English and the default voice for English is Alex. In Step 2, we will add code to create a menu to help the user choose voices for all available languages.
let speakBtn, txtFld; function init() { speakBtn = qs("#speakBtn"); txtFld = qs("#txtFld"); speakBtn.addEventListener("click", talk, false); if (!window.speechSynthesis) { speakBtn.disabled = true; qs("#warning").style.display = "block"; } } function talk() { let u = new SpeechSynthesisUtterance(); u.text = txtFld.value; speechSynthesis.speak(u); } // Reusable utility functions function qs(selectorText) { // Saves lots of typing for those who eschew jQuery return document.querySelector(selectorText); } document.addEventListener('DOMContentLoaded', function (e) { try {init();} catch (error) { console.log("Data didn't load", error); } });
Step 2: A Menu of International Voices
If we want to use anything other than the default language and speaking voice, we will have to add a bit more code. So that’s what we’re going tackle next.
We’re going to add a select element to hold the menu of voice options:
<h1>Multilingual Text To Speech</h1> <div class="uiunit"> <label for="speakerMenu">Voice: </label> <select id="speakerMenu"></select> speaks <span id="language">English.</span> <!-- etc. --> </div>
Before we create the code to populate the menu options, we should take care of the code that will help us connect language codes to their corresponding names. Each language is identified by a two-letter code such as "en" for English or "es" for Español (Spanish). We will take a simple list of these codes and their corresponding languages and make an array of objects of the form: {"code": "pt", "name": "Portuguese"}. Then we’ll need a utility function to help us search an array of objects for the value of a given property. We will use it in a few minutes to quickly find the language name that matches the language code of the selected voice. Copy the code below so that the two functions are just above and just below the // Generic Utility Functions comment.
function getLanguageTags() { let langs = ["ar-Arabic","cs-Czech","da-Danish","de-German","el-Greek","en-English","eo-Esperanto","es-Spanish","et-Estonian","fi-Finnish","fr-French","he-Hebrew","hi-Hindi","hu-Hungarian","id-Indonesian","it-Italian","ja-Japanese","ko-Korean","la-Latin","lt-Lithuanian","lv-Latvian","nb-Norwegian Bokmal","nl-Dutch","nn-Norwegian Nynorsk","no-Norwegian","pl-Polish","pt-Portuguese","ro-Romanian","ru-Russian","sk-Slovak","sl-Slovenian","sq-Albanian","sr-Serbian","sv-Swedish","th-Thai","tr-Turkish","zh-Chinese"]; let langobjects = []; for (let i=0;i<langs.length;i++) { let langparts = langs[i].split("-"); langobjects.push({"code":langparts[0],"name":langparts[1]}); } return langobjects; } // Generic Utility Functions function searchObjects(array, prop, term, casesensitive = false) { // Searches an array of objects for a given term in a given property // Returns an array of only those objects that test positive let regex = new RegExp(term, casesensitive ? "" : "i"); let newArrayOfObjects = array.filter(obj => regex.test(obj[prop])); return newArrayOfObjects; }
Now we can build out the options for the select element using JavaScript. We need to declare variables at the top of our JavaScript to hold references to the #speakerMenu select element, the #language span element, the array of synthesized voices (allVoices), an array of codes to identify the languages (langtags), and a place to keep track of the currently selected voice (voiceIndex). Add those just after the two variable declarations we created in Step 1.
let speakBtn, txtFld, speakerMenu, language, allVoices, langtags; let voiceIndex = 0;
The updated init() function sets some additional references to the #speakerMenu and the #language span and places all the language codes into an array of objects called langtags. The feature detection part of the code changes here, too. If the Web Speech API is supported, the setUpVoices() function is called. Also, for Chrome, we have to listen for changes to the loaded voices and repeat the setup when needed. Chrome polls the available voices every time you switch between one of its remote voices (the ones listed with the Google prefix while you are in Chrome) and all the other voices which are stored locally in the user’s operating system.
function init() { speakBtn = qs("#speakBtn"); txtFld = qs("#txtFld"); speakerMenu = qs("#speakerMenu"); language = qs("#language"); langtags = getLanguageTags(); speakBtn.addEventListener("click", talk, false); speakerMenu.addEventListener("change", selectSpeaker, false); if (window.speechSynthesis) { if (speechSynthesis.onvoiceschanged !== undefined) { // Chrome gets the voices asynchronously so this is needed speechSynthesis.onvoiceschanged = setUpVoices; } setUpVoices(); // For all the other browsers } else{ speakBtn.disabled = true; speakerMenu.disabled = true; qs("#warning").style.display = "block"; } }
The setUpVoices() function gets an array of what are called SpeechSynthesisVoice objects by calling the getVoices() method of the speechSynthesis object. This is done in our code using the getAllVoices() function. Unfortunately, I have found that the speechSynthesis.getVoices() method sometimes returns duplicates in the list, so I devoted nine lines of code to eliminate the those. Finally, at the end of getAllVoices(), I added a unique identifier number to each of the SpeechSynthesisVoice objects. That will help us in Step 3 when we need to filter the list of voices to only show voices for a given language. When complete, the allVoices array will contain objects that look like the ones below. Each object has id, voiceURI, name, and lang attributes. The localService attribute indicates whether the code for the voice is stored on the user’s computer or remotely on Google’s servers. Notice the lang attribute. The value consists of a two-letter language code (e.g. "es" for Spanish) followed by a dash and a region code (e.g. "MX" for Mexico). This identifies the language and regional accent of each voice.
{id:48, voiceURI:"Paulina", name:"Paulina", lang: "es-MX", localService:true}, {id:52, voiceURI:"Samantha", name:"Samantha", lang: "en-US", localService:true}, {id:72, voiceURI:"Google Deutsch", name:"Google Deutsch", lang: "de-DE", localService:false}
The last line of setUpVoices() calls a function to create the list of options that will appear in the #speakerMenu select element. The value of the id attribute for each voice is placed in the value attribute for the option. The name and lang attributes are the visible text items that appear in each option along with "(premium)" for those voices that are marked that way on some operating systems and browsers.
function setUpVoices() { allVoices = getAllVoices(); createSpeakerMenu(allVoices); } function getAllVoices() { let voicesall = speechSynthesis.getVoices(); let vuris = []; let voices = []; voicesall.forEach(function(obj,index) { let uri = obj.voiceURI; if (!vuris.includes(uri)) { vuris.push(uri); voices.push(obj); } }); voices.forEach(function(obj,index) {obj.id = index;}); return voices; } function createSpeakerMenu(voices) { let code = ; voices.forEach(function(vobj,i) { code += `<option value=${vobj.id}>`; code += `${vobj.name} (${vobj.lang})`; code += vobj.voiceURI.includes(".premium") ? ' (premium)' : ; code += `</option>`; }); speakerMenu.innerHTML = code; speakerMenu.selectedIndex = voiceIndex; }
You might recall that in the init() function, we had set up an event listener to call selectSpeaker() whenever the speakerMenu changes. The selectSpeaker() function stores the selectedIndex of the #speakerMenu select element. Next, it gets the value of the selected item which will be an integer that corresponds to the index of that voice in the allVoices() array. So, now we have retrieved the SpeechSynthesisVoice we want. We then grab the first two letters of the lang attribute (e.g. "en," "es," "ru," "de," "fr") and use that code to search the langtags array of language objects to find the appropriate language name. The searchObjects() function returns an array that will likely have only one entry. Regardless, the first entry (langcodeobj[0]) is all we need. Finally, we assign that name to the innerHTML attribute of the language span and it shows on the screen as expected.
// Code for when the user selects a speaker function selectSpeaker() { voiceIndex = speakerMenu.selectedIndex; let sval = Number(speakerMenu.value); let voice = allVoices[sval]; let langcode = voice.lang.substring(0,2); let langcodeobj = searchObjects(langtags, "code", langcode); language.innerHTML = langcodeobj[0].name; }
The only thing left for Step 2 to be complete is to make sure the talk() function works when we click the "Speak" button. Modify the talk() function to add attributes to the utterance to control which voice and language are used and how fast to speak the text. In my testing, a rate range of 0.5 to 2 works reliably well. I found that a rate below 0.5 has no effect. I think 0.8 works as a nice default for many languages, but as we’ll see in Step 3, there’s an easy way to let the user decide.
function talk() { let sval = Number(speakerMenu.value); let u = new SpeechSynthesisUtterance(); u.voice = allVoices[sval]; u.lang = u.voice.lang; u.text = txtFld.value; u.rate = 0.8; speechSynthesis.speak(u); }
That’s it for Step 2! Here’s the result of what we’ve done so far:
See the Pen Text-To-Speech Part 2 by Steven Estrella (@sgestrella) on CodePen.
Play around with it a bit. Sometimes it is fun to type an English phrase and then assign a French or German speaker to say it. Conversely, if you want to hear your worst first-year Spanish student, type a Spanish phrase and assign it to be spoken by an English voice.
Step 3: The Complete Polyglot
We’re in the final stretch! Some of the things we do in this step will be bits of polish to the UI but there are some functional things we need to do as well to button everything up. specifically, we’re going to:
Create a menu of available language options
Allow users to define the speed of the speech
Define a default phrase in the textarea that translates on language selection
Here’s what we’re looking at:
We’re adding a dropdown menu, speech rate setting, and a default phrase.
In the HTML, we’re going to add a new <select> element for the language menu and a number input (which will be used later to set the rate of speech). Notice we have deleted the #language span as it is no longer relevant once the language menu is working.
<div class="uiunit"> <label for="languageMenu">Language: </label> <select id="languageMenu"> <option selected value="all">Show All</option> </select> </div> <div class="uiunit"> <label for="speakerMenu">Voice: </label><select id="speakerMenu"></select> </div> <div class="uiunit"> <label for="rateFld">Speed: </label> <input type="number" id="rateFld" min="0.5" max="2" step="0.1" value="0.8" /> </div>
In the JavaScript, we will need to modify the variable declarations. We will keep track of all dialects in the allLanguages array and just the main languages in the primaryLanguages array. The langhash and langcodehash arrays will serve as hash tables so we can quickly get a language name when all we know is the two-letter language code and vice versa. We should only need to setup the languages menu once so a Boolean flag for initialSetup will come in handy.
let speakBtn, txtFld, speakerMenu, allVoices, langtags; let voiceIndex = 0; let allLanguages, primaryLanguages, langhash, langcodehash; let rateFld, languageMenu, blurbs; let initialSetup = true; let defaultBlurb = "I enjoy the traditional music of my native country.";
In the new init() function, let’s remove the line language = qs("#language"); then add the new code as seen here to create the blurbs, reference the rateFld number input and languageMenu select, and create hash tables for looking up language names and tags.
function init() { // ...keep existing content but delete language = qs("#language"); createBlurbs(); rateFld = qs("#rateFld"); languageMenu = qs("#languageMenu"); languageMenu.addEventListener("change", selectLanguage, false); langhash = getLookupTable(langtags, "name"); langcodehash = getLookupTable(langtags, "code"); if (window.speechSynthesis) { // ...keep existing content } else{ // ...keep existing content languageMenu.disabled = true; } }
The setUpVoices() function needs some work to accommodate the new languages menu and to trigger the filterVoices() function which we will use now to populate the #speakerMenu element. Also, we’re going to add the new functions: getAllLanguages() and getPrimaryLanguages(). The first one assembles an array of the unique values for the lang attribute found in the allVoices array of objects. Notice the return statement uses the spread operator combined with a new Set object to ensure that the returned array has no duplicates. The getPrimaryLanguages() function returns an array of the two-letter country codes. That makes a smaller list of just the main languages without reference to regional dialects.
function setUpVoices() { allVoices = getAllVoices(); allLanguages = getAllLanguages(allVoices); primaryLanguages = getPrimaryLanguages(allLanguages); filterVoices(); if (initialSetup && allVoices.length) { initialSetup = false; createLanguageMenu(); } } function getAllLanguages(voices) { let langs = []; voices.forEach(vobj => { langs.push(vobj.lang.trim()); }); return [...new Set(langs)]; } function getPrimaryLanguages(langlist) { let langs = []; langlist.forEach(vobj => { langs.push(vobj.substring(0,2)); }); return [...new Set(langs)]; }
The setUpVoices() function calls two additional functions. The filterVoices() function gets the two-letter language code from the current value of the #languageMenu select menu and uses it to filter the allVoices array and return only the available voice options for the chosen language. It then passes that array to the createSpeakerMenu() function (unchanged from Step 2) which populates the #speakerMenu with options. Then filterVoices() gets the blurb associated with the chosen language and places it in the textarea where it can be edited or replaced.
And, in case Chrome rebuilds this menu, the stored voiceIndex is used to restore the current selection. Next the createLanguageMenu() function uses our hash tables to create the needed menu options for the languageMenu select element. The selectLanguage() function is triggered whenever the user chooses a language. It then triggers filterVoices() and sets the #speakerMenu to display the first available option.
function filterVoices() { let langcode = languageMenu.value; voices = allVoices.filter(function (voice) { return langcode === "all" ? true : voice.lang.indexOf(langcode + "-") >= 0; }); createSpeakerMenu(voices); let t = blurbs[languageMenu.options[languageMenu.selectedIndex].text]; txtFld.value = t ? t : defaultBlurb; speakerMenu.selectedIndex = voiceIndex; } function createLanguageMenu() { let code = `<option selected value="all">Show All</option>`; let langnames = []; primaryLanguages.forEach(function(lobj,i) { langnames.push(langcodehash[lobj.substring(0,2)].name); }); langnames.sort(); langnames.forEach(function(lname,i) { let lcode = langhash[lname].code; code += `<option value=${lcode}>${lname}</option>`; }); languageMenu.innerHTML = code; } function selectLanguage() { filterVoices(); speakerMenu.selectedIndex = 0; }
In the utility functions section of the code toward the bottom, add the following code. This generic little utility will help you the next time you need to create a lookup table for an array of objects. In our case, we will use this to allow us to easily match a language code with its corresponding language name and vice versa.
function getLookupTable(objectsArray, propname) { return objectsArray.reduce((accumulator, currentValue) => (accumulator[currentValue[propname]] = currentValue, accumulator),{}); }
I added an array of text phrases, each of which is a translation of the English phrase, "I enjoy the traditional music of my native country." The language it’s displayed in will correspond to what’s selected in the language men.
Here we see the beauty of UTF-8 on full display. Above the getLanguagesTags() function, let’s add the code that generates all those translated blurbs. I only read Spanish, English, some Portuguese, and very little German, so I have to take on faith that Google Translate is providing accurate translations for the rest. If any of these is your native language, feel free to leave corrections in the comments.
function createBlurbs() { blurbs = { "Arabic" : "أنا أستمتع بالموسيقى التقليدية لبلدي الأم.", "Chinese" : "我喜歡我祖國的傳統音樂。", "Czech" : "Mám rád tradiční hudbu mé rodné země.", "Danish" : "Jeg nyder den traditionelle musik i mit hjemland.", "Dutch" : "Ik geniet van de traditionele muziek van mijn geboorteland.", "English" : "I enjoy the traditional music of my native country.", "Finnish" : "Nautin kotimaassani perinteistä musiikkia.", "French" : "J'apprécie la musique traditionnelle de mon pays d'origine.", "German" : "Ich genieße die traditionelle Musik meiner Heimat.", "Greek" : "Απολαμβάνω την παραδοσιακή μουσική της πατρίδας μου.", "Hebrew" : "אני נהנה מהמוסיקה המסורתית של מולדתי.", "Hindi" : "मैं अपने मूल देश के पारंपरिक संगीत का आनंद लेता हूं।", "Hungarian" : "Élvezem az én hazám hagyományos zenéjét.", "Indonesian" : "Saya menikmati musik tradisional negara asal saya.", "Italian" : "Mi piace la musica tradizionale del mio paese natale.", "Japanese" : "私は母国の伝統音楽���楽しんでいます。", "Korean" : "나는 내 조국의 전통 음악을 즐긴다.", "Norwegian Bokmal" : "Jeg liker den tradisjonelle musikken i mitt hjemland.", "Polish" : "Lubię tradycyjną muzykę mojego kraju.", "Portuguese" : "Eu gosto da música tradicional do meu país natal.", "Romanian" : "Îmi place muzica tradițională din țara mea natală.", "Russian" : "Мне нравится традиционная музыка моей родной страны.", "Slovak" : "Mám rád tradičnú hudbu svojej rodnej krajiny.", "Spanish" : "Disfruto de la música tradicional de mi país natal.", "Swedish" : "Jag njuter av traditionell musik i mitt hemland.", "Thai" : "ฉันเพลิดเพลินกับดนตรีดั้งเดิมของประเทศบ้านเกิดของฉัน", "Turkish" : "Ülkemdeki geleneksel müzikten zevk alıyorum." }; }
There’s one last thing: the numeric input for controlling the playback speed of the speech. Modify the talk() function to get the speech rate from the number input and we’re good to go!
Here’s the final product:
function talk() { ...// no changes except for the rateFld.value reference u.rate = Number(rateFld.value); speechSynthesis.speak(u); }
See the Pen Polyglot: Text-To-Speech in Multiple Languages by Steven Estrella (@sgestrella) on CodePen.
A Real World Application
My interest in this technology started many years ago in 1990 when I created a 26-lesson curriculum as part of my dissertation. It was delivered using my first programming language, HyperCard, on a Macintosh Plus which had a primitive text-to-speech feature. I used that feature to provide some feedback to the user while they progressed through the material. More recently, in 2018, I created a free progressive web app called Buenos Verbos that helps Spanish language students search and filter a database of 766 verbs. The chosen verb is then fully conjugated and the user can click the forms to hear them spoken. So perhaps web pages might like to talk and with some imagination you may find reasons to encourage them. The question is: what will you make your website say next?
The post Using the Web Speech API for Multilingual Translations appeared first on CSS-Tricks.
Using the Web Speech API for Multilingual Translations published first on https://deskbysnafu.tumblr.com/
0 notes
Text
Using the Web Speech API for Multilingual Translations
Since the early days of science fiction, we have fantasized about machines that talk to us. Today it is commonplace. Even so, the technology for making websites talk is still pretty new.
We can make our pages on the web talk using the SpeechSynthesis part of the Web Speech API. This is still considered an experimental technology but it has great support in the latest versions of Chrome, Safari, and Firefox.
The fun part for me is using this technology with foreign languages. For that, Mac OSX has great support for this on all browsers. On Windows, you have to use Chrome. We’re going to walk through a three-step process to create a page that speaks the same text in multiple languages. Some of the basic code is derived from documentation found here but the final product adds some fun features and can be viewed at my Polyglot CodePen here.
Screen shot of the completed Polyglot app with a menu of languages.
Step 1: Start Simple
Let’s create a basic page with a <textarea> for the text we want the page to speak and include a button to click to trigger the speech.
<div id="wrapper"> <h1>Simple Text To Speech</h1> <p id="warning">Sorry, your browser does not support the Web Speech API.</p> <textarea id="txtFld">I love the sound of my computer-generated voice.</textarea> <label for="txtFld">Type text above. Then click the Speak button.</label> <div> <button type="button" id="speakBtn">Speak</button> <br> <p>Note: For best results on a Mac, use the latest version of Chrome, Safari, or FireFox. On Windows, use Chrome.</p> </div> </div>
The paragraph with ID warning will be shown only if the JavaScript detects no support for the Web Speech API. Also, note the ID values for the textarea and the button as we will use those in our JavaScript.
Feel free to style the HTML any way you’d like. You’re also free to work off the demo I created:
See the Pen Text-To-Speech Part 1 by Steven Estrella (@sgestrella) on CodePen.
Adding a style rule for the disabled state of the button is a good idea to avoid confusion for the few people who still use incompatible browsers, like the now-quaint Internet Explorer. Also, let’s use a style rule to hide the warning by default so we can control when it’s actually needed.
button:disabled { cursor: not-allowed; opacity: 0.3; } #warning { color: red; display: none; font-size: 1.4rem; }
Now on to the JavaScript! First, we add two variables to serve as references to the "Speak" button that triggers the speech and to the <textarea> element. An event listener at the bottom of the code tells the document to wait until the DOM elements load before calling the init() function. I used a handy utility function I call "qs" that is defined at the bottom of the code. It is a shortcut alternative to document.querySelector and it selects whatever selector value I pass to it and returns an object reference. Then we’ll add an event listener to the speakBtn object to make the button call the talk() function.
The talk() function creates a new instance of the SpeechSynthesisUtterance object that is part of the Web Speech API. It adds the text from the <textarea>(using ID txtFld) to the text property. Then the utterance is passed to the speechSynthesis method of the window object and we hear the spoken text. The specific voice you hear will vary by browser and operating system. On my Mac, for example, my default language is set to American English and the default voice for English is Alex. In Step 2, we will add code to create a menu to help the user choose voices for all available languages.
let speakBtn, txtFld; function init() { speakBtn = qs("#speakBtn"); txtFld = qs("#txtFld"); speakBtn.addEventListener("click", talk, false); if (!window.speechSynthesis) { speakBtn.disabled = true; qs("#warning").style.display = "block"; } } function talk() { let u = new SpeechSynthesisUtterance(); u.text = txtFld.value; speechSynthesis.speak(u); } // Reusable utility functions function qs(selectorText) { // Saves lots of typing for those who eschew jQuery return document.querySelector(selectorText); } document.addEventListener('DOMContentLoaded', function (e) { try {init();} catch (error) { console.log("Data didn't load", error); } });
Step 2: A Menu of International Voices
If we want to use anything other than the default language and speaking voice, we will have to add a bit more code. So that’s what we’re going tackle next.
We’re going to add a select element to hold the menu of voice options:
<h1>Multilingual Text To Speech</h1> <div class="uiunit"> <label for="speakerMenu">Voice: </label> <select id="speakerMenu"></select> speaks <span id="language">English.</span> <!-- etc. --> </div>
Before we create the code to populate the menu options, we should take care of the code that will help us connect language codes to their corresponding names. Each language is identified by a two-letter code such as "en" for English or "es" for Español (Spanish). We will take a simple list of these codes and their corresponding languages and make an array of objects of the form: {"code": "pt", "name": "Portuguese"}. Then we’ll need a utility function to help us search an array of objects for the value of a given property. We will use it in a few minutes to quickly find the language name that matches the language code of the selected voice. Copy the code below so that the two functions are just above and just below the // Generic Utility Functions comment.
function getLanguageTags() { let langs = ["ar-Arabic","cs-Czech","da-Danish","de-German","el-Greek","en-English","eo-Esperanto","es-Spanish","et-Estonian","fi-Finnish","fr-French","he-Hebrew","hi-Hindi","hu-Hungarian","id-Indonesian","it-Italian","ja-Japanese","ko-Korean","la-Latin","lt-Lithuanian","lv-Latvian","nb-Norwegian Bokmal","nl-Dutch","nn-Norwegian Nynorsk","no-Norwegian","pl-Polish","pt-Portuguese","ro-Romanian","ru-Russian","sk-Slovak","sl-Slovenian","sq-Albanian","sr-Serbian","sv-Swedish","th-Thai","tr-Turkish","zh-Chinese"]; let langobjects = []; for (let i=0;i<langs.length;i++) { let langparts = langs[i].split("-"); langobjects.push({"code":langparts[0],"name":langparts[1]}); } return langobjects; } // Generic Utility Functions function searchObjects(array, prop, term, casesensitive = false) { // Searches an array of objects for a given term in a given property // Returns an array of only those objects that test positive let regex = new RegExp(term, casesensitive ? "" : "i"); let newArrayOfObjects = array.filter(obj => regex.test(obj[prop])); return newArrayOfObjects; }
Now we can build out the options for the select element using JavaScript. We need to declare variables at the top of our JavaScript to hold references to the #speakerMenu select element, the #language span element, the array of synthesized voices (allVoices), an array of codes to identify the languages (langtags), and a place to keep track of the currently selected voice (voiceIndex). Add those just after the two variable declarations we created in Step 1.
let speakBtn, txtFld, speakerMenu, language, allVoices, langtags; let voiceIndex = 0;
The updated init() function sets some additional references to the #speakerMenu and the #language span and places all the language codes into an array of objects called langtags. The feature detection part of the code changes here, too. If the Web Speech API is supported, the setUpVoices() function is called. Also, for Chrome, we have to listen for changes to the loaded voices and repeat the setup when needed. Chrome polls the available voices every time you switch between one of its remote voices (the ones listed with the Google prefix while you are in Chrome) and all the other voices which are stored locally in the user’s operating system.
function init() { speakBtn = qs("#speakBtn"); txtFld = qs("#txtFld"); speakerMenu = qs("#speakerMenu"); language = qs("#language"); langtags = getLanguageTags(); speakBtn.addEventListener("click", talk, false); speakerMenu.addEventListener("change", selectSpeaker, false); if (window.speechSynthesis) { if (speechSynthesis.onvoiceschanged !== undefined) { // Chrome gets the voices asynchronously so this is needed speechSynthesis.onvoiceschanged = setUpVoices; } setUpVoices(); // For all the other browsers } else{ speakBtn.disabled = true; speakerMenu.disabled = true; qs("#warning").style.display = "block"; } }
The setUpVoices() function gets an array of what are called SpeechSynthesisVoice objects by calling the getVoices() method of the speechSynthesis object. This is done in our code using the getAllVoices() function. Unfortunately, I have found that the speechSynthesis.getVoices() method sometimes returns duplicates in the list, so I devoted nine lines of code to eliminate the those. Finally, at the end of getAllVoices(), I added a unique identifier number to each of the SpeechSynthesisVoice objects. That will help us in Step 3 when we need to filter the list of voices to only show voices for a given language. When complete, the allVoices array will contain objects that look like the ones below. Each object has id, voiceURI, name, and lang attributes. The localService attribute indicates whether the code for the voice is stored on the user’s computer or remotely on Google’s servers. Notice the lang attribute. The value consists of a two-letter language code (e.g. "es" for Spanish) followed by a dash and a region code (e.g. "MX" for Mexico). This identifies the language and regional accent of each voice.
{id:48, voiceURI:"Paulina", name:"Paulina", lang: "es-MX", localService:true}, {id:52, voiceURI:"Samantha", name:"Samantha", lang: "en-US", localService:true}, {id:72, voiceURI:"Google Deutsch", name:"Google Deutsch", lang: "de-DE", localService:false}
The last line of setUpVoices() calls a function to create the list of options that will appear in the #speakerMenu select element. The value of the id attribute for each voice is placed in the value attribute for the option. The name and lang attributes are the visible text items that appear in each option along with "(premium)" for those voices that are marked that way on some operating systems and browsers.
function setUpVoices() { allVoices = getAllVoices(); createSpeakerMenu(allVoices); } function getAllVoices() { let voicesall = speechSynthesis.getVoices(); let vuris = []; let voices = []; voicesall.forEach(function(obj,index) { let uri = obj.voiceURI; if (!vuris.includes(uri)) { vuris.push(uri); voices.push(obj); } }); voices.forEach(function(obj,index) {obj.id = index;}); return voices; } function createSpeakerMenu(voices) { let code = ; voices.forEach(function(vobj,i) { code += `<option value=${vobj.id}>`; code += `${vobj.name} (${vobj.lang})`; code += vobj.voiceURI.includes(".premium") ? ' (premium)' : ; code += `</option>`; }); speakerMenu.innerHTML = code; speakerMenu.selectedIndex = voiceIndex; }
You might recall that in the init() function, we had set up an event listener to call selectSpeaker() whenever the speakerMenu changes. The selectSpeaker() function stores the selectedIndex of the #speakerMenu select element. Next, it gets the value of the selected item which will be an integer that corresponds to the index of that voice in the allVoices() array. So, now we have retrieved the SpeechSynthesisVoice we want. We then grab the first two letters of the lang attribute (e.g. "en," "es," "ru," "de," "fr") and use that code to search the langtags array of language objects to find the appropriate language name. The searchObjects() function returns an array that will likely have only one entry. Regardless, the first entry (langcodeobj[0]) is all we need. Finally, we assign that name to the innerHTML attribute of the language span and it shows on the screen as expected.
// Code for when the user selects a speaker function selectSpeaker() { voiceIndex = speakerMenu.selectedIndex; let sval = Number(speakerMenu.value); let voice = allVoices[sval]; let langcode = voice.lang.substring(0,2); let langcodeobj = searchObjects(langtags, "code", langcode); language.innerHTML = langcodeobj[0].name; }
The only thing left for Step 2 to be complete is to make sure the talk() function works when we click the "Speak" button. Modify the talk() function to add attributes to the utterance to control which voice and language are used and how fast to speak the text. In my testing, a rate range of 0.5 to 2 works reliably well. I found that a rate below 0.5 has no effect. I think 0.8 works as a nice default for many languages, but as we’ll see in Step 3, there’s an easy way to let the user decide.
function talk() { let sval = Number(speakerMenu.value); let u = new SpeechSynthesisUtterance(); u.voice = allVoices[sval]; u.lang = u.voice.lang; u.text = txtFld.value; u.rate = 0.8; speechSynthesis.speak(u); }
That’s it for Step 2! Here’s the result of what we’ve done so far:
See the Pen Text-To-Speech Part 2 by Steven Estrella (@sgestrella) on CodePen.
Play around with it a bit. Sometimes it is fun to type an English phrase and then assign a French or German speaker to say it. Conversely, if you want to hear your worst first-year Spanish student, type a Spanish phrase and assign it to be spoken by an English voice.
Step 3: The Complete Polyglot
We’re in the final stretch! Some of the things we do in this step will be bits of polish to the UI but there are some functional things we need to do as well to button everything up. specifically, we’re going to:
Create a menu of available language options
Allow users to define the speed of the speech
Define a default phrase in the textarea that translates on language selection
Here’s what we’re looking at:
We’re adding a dropdown menu, speech rate setting, and a default phrase.
In the HTML, we’re going to add a new <select> element for the language menu and a number input (which will be used later to set the rate of speech). Notice we have deleted the #language span as it is no longer relevant once the language menu is working.
<div class="uiunit"> <label for="languageMenu">Language: </label> <select id="languageMenu"> <option selected value="all">Show All</option> </select> </div> <div class="uiunit"> <label for="speakerMenu">Voice: </label><select id="speakerMenu"></select> </div> <div class="uiunit"> <label for="rateFld">Speed: </label> <input type="number" id="rateFld" min="0.5" max="2" step="0.1" value="0.8" /> </div>
In the JavaScript, we will need to modify the variable declarations. We will keep track of all dialects in the allLanguages array and just the main languages in the primaryLanguages array. The langhash and langcodehash arrays will serve as hash tables so we can quickly get a language name when all we know is the two-letter language code and vice versa. We should only need to setup the languages menu once so a Boolean flag for initialSetup will come in handy.
let speakBtn, txtFld, speakerMenu, allVoices, langtags; let voiceIndex = 0; let allLanguages, primaryLanguages, langhash, langcodehash; let rateFld, languageMenu, blurbs; let initialSetup = true; let defaultBlurb = "I enjoy the traditional music of my native country.";
In the new init() function, let’s remove the line language = qs("#language"); then add the new code as seen here to create the blurbs, reference the rateFld number input and languageMenu select, and create hash tables for looking up language names and tags.
function init() { // ...keep existing content but delete language = qs("#language"); createBlurbs(); rateFld = qs("#rateFld"); languageMenu = qs("#languageMenu"); languageMenu.addEventListener("change", selectLanguage, false); langhash = getLookupTable(langtags, "name"); langcodehash = getLookupTable(langtags, "code"); if (window.speechSynthesis) { // ...keep existing content } else{ // ...keep existing content languageMenu.disabled = true; } }
The setUpVoices() function needs some work to accommodate the new languages menu and to trigger the filterVoices() function which we will use now to populate the #speakerMenu element. Also, we’re going to add the new functions: getAllLanguages() and getPrimaryLanguages(). The first one assembles an array of the unique values for the lang attribute found in the allVoices array of objects. Notice the return statement uses the spread operator combined with a new Set object to ensure that the returned array has no duplicates. The getPrimaryLanguages() function returns an array of the two-letter country codes. That makes a smaller list of just the main languages without reference to regional dialects.
function setUpVoices() { allVoices = getAllVoices(); allLanguages = getAllLanguages(allVoices); primaryLanguages = getPrimaryLanguages(allLanguages); filterVoices(); if (initialSetup && allVoices.length) { initialSetup = false; createLanguageMenu(); } } function getAllLanguages(voices) { let langs = []; voices.forEach(vobj => { langs.push(vobj.lang.trim()); }); return [...new Set(langs)]; } function getPrimaryLanguages(langlist) { let langs = []; langlist.forEach(vobj => { langs.push(vobj.substring(0,2)); }); return [...new Set(langs)]; }
The setUpVoices() function calls two additional functions. The filterVoices() function gets the two-letter language code from the current value of the #languageMenu select menu and uses it to filter the allVoices array and return only the available voice options for the chosen language. It then passes that array to the createSpeakerMenu() function (unchanged from Step 2) which populates the #speakerMenu with options. Then filterVoices() gets the blurb associated with the chosen language and places it in the textarea where it can be edited or replaced.
And, in case Chrome rebuilds this menu, the stored voiceIndex is used to restore the current selection. Next the createLanguageMenu() function uses our hash tables to create the needed menu options for the languageMenu select element. The selectLanguage() function is triggered whenever the user chooses a language. It then triggers filterVoices() and sets the #speakerMenu to display the first available option.
function filterVoices() { let langcode = languageMenu.value; voices = allVoices.filter(function (voice) { return langcode === "all" ? true : voice.lang.indexOf(langcode + "-") >= 0; }); createSpeakerMenu(voices); let t = blurbs[languageMenu.options[languageMenu.selectedIndex].text]; txtFld.value = t ? t : defaultBlurb; speakerMenu.selectedIndex = voiceIndex; } function createLanguageMenu() { let code = `<option selected value="all">Show All</option>`; let langnames = []; primaryLanguages.forEach(function(lobj,i) { langnames.push(langcodehash[lobj.substring(0,2)].name); }); langnames.sort(); langnames.forEach(function(lname,i) { let lcode = langhash[lname].code; code += `<option value=${lcode}>${lname}</option>`; }); languageMenu.innerHTML = code; } function selectLanguage() { filterVoices(); speakerMenu.selectedIndex = 0; }
In the utility functions section of the code toward the bottom, add the following code. This generic little utility will help you the next time you need to create a lookup table for an array of objects. In our case, we will use this to allow us to easily match a language code with its corresponding language name and vice versa.
function getLookupTable(objectsArray, propname) { return objectsArray.reduce((accumulator, currentValue) => (accumulator[currentValue[propname]] = currentValue, accumulator),{}); }
I added an array of text phrases, each of which is a translation of the English phrase, "I enjoy the traditional music of my native country." The language it’s displayed in will correspond to what’s selected in the language men.
Here we see the beauty of UTF-8 on full display. Above the getLanguagesTags() function, let’s add the code that generates all those translated blurbs. I only read Spanish, English, some Portuguese, and very little German, so I have to take on faith that Google Translate is providing accurate translations for the rest. If any of these is your native language, feel free to leave corrections in the comments.
function createBlurbs() { blurbs = { "Arabic" : "أنا أستمتع بالموسيقى التقليدية لبلدي الأم.", "Chinese" : "我喜歡我祖國的傳統音樂。", "Czech" : "Mám rád tradiční hudbu mé rodné země.", "Danish" : "Jeg nyder den traditionelle musik i mit hjemland.", "Dutch" : "Ik geniet van de traditionele muziek van mijn geboorteland.", "English" : "I enjoy the traditional music of my native country.", "Finnish" : "Nautin kotimaassani perinteistä musiikkia.", "French" : "J'apprécie la musique traditionnelle de mon pays d'origine.", "German" : "Ich genieße die traditionelle Musik meiner Heimat.", "Greek" : "Απολαμβάνω την παραδοσιακή μουσική της πατρίδας μου.", "Hebrew" : "אני נהנה מהמוסיקה המסורתית של מולדתי.", "Hindi" : "मैं अपने मूल देश के पारंपरिक संगीत का आनंद लेता हूं।", "Hungarian" : "Élvezem az én hazám hagyományos zenéjét.", "Indonesian" : "Saya menikmati musik tradisional negara asal saya.", "Italian" : "Mi piace la musica tradizionale del mio paese natale.", "Japanese" : "私は母国の伝統音楽を楽しんでいます。", "Korean" : "나는 내 조국의 전통 음악을 즐긴다.", "Norwegian Bokmal" : "Jeg liker den tradisjonelle musikken i mitt hjemland.", "Polish" : "Lubię tradycyjną muzykę mojego kraju.", "Portuguese" : "Eu gosto da música tradicional do meu país natal.", "Romanian" : "Îmi place muzica tradițională din țara mea natală.", "Russian" : "Мне нравится традиционная музыка моей родной страны.", "Slovak" : "Mám rád tradičnú hudbu svojej rodnej krajiny.", "Spanish" : "Disfruto de la música tradicional de mi país natal.", "Swedish" : "Jag njuter av traditionell musik i mitt hemland.", "Thai" : "ฉันเพลิดเพลินกับดนตรีดั้งเดิมของประเทศบ้านเกิดของฉัน", "Turkish" : "Ülkemdeki geleneksel müzikten zevk alıyorum." }; }
There’s one last thing: the numeric input for controlling the playback speed of the speech. Modify the talk() function to get the speech rate from the number input and we’re good to go!
Here’s the final product:
function talk() { ...// no changes except for the rateFld.value reference u.rate = Number(rateFld.value); speechSynthesis.speak(u); }
See the Pen Polyglot: Text-To-Speech in Multiple Languages by Steven Estrella (@sgestrella) on CodePen.
A Real World Application
My interest in this technology started many years ago in 1990 when I created a 26-lesson curriculum as part of my dissertation. It was delivered using my first programming language, HyperCard, on a Macintosh Plus which had a primitive text-to-speech feature. I used that feature to provide some feedback to the user while they progressed through the material. More recently, in 2018, I created a free progressive web app called Buenos Verbos that helps Spanish language students search and filter a database of 766 verbs. The chosen verb is then fully conjugated and the user can click the forms to hear them spoken. So perhaps web pages might like to talk and with some imagination you may find reasons to encourage them. The question is: what will you make your website say next?
The post Using the Web Speech API for Multilingual Translations appeared first on CSS-Tricks.
😉SiliconWebX | 🌐CSS-Tricks
0 notes